MMEx with SPI Slave to allow legacy devices to communicate with modern media such as USB, SD cards, the internet and all of the mbed\'s other interfaces

Dependencies:   NetServices MSCUsbHost mbed TMP102 SDFileSystem

Committer:
DeMein
Date:
Sun Feb 27 18:54:40 2011 +0000
Revision:
0:67a55a82ce06
Version as submitted to the NXP Design Challenge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DeMein 0:67a55a82ce06 1 /* MMEx for MBED - Parameter Command processing
DeMein 0:67a55a82ce06 2 * Copyright (c) 2011 MK
DeMein 0:67a55a82ce06 3 *
DeMein 0:67a55a82ce06 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
DeMein 0:67a55a82ce06 5 * of this software and associated documentation files (the "Software"), to deal
DeMein 0:67a55a82ce06 6 * in the Software without restriction, including without limitation the rights
DeMein 0:67a55a82ce06 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
DeMein 0:67a55a82ce06 8 * copies of the Software, and to permit persons to whom the Software is
DeMein 0:67a55a82ce06 9 * furnished to do so, subject to the following conditions:
DeMein 0:67a55a82ce06 10 *
DeMein 0:67a55a82ce06 11 * The above copyright notice and this permission notice shall be included in
DeMein 0:67a55a82ce06 12 * all copies or substantial portions of the Software.
DeMein 0:67a55a82ce06 13 *
DeMein 0:67a55a82ce06 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
DeMein 0:67a55a82ce06 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
DeMein 0:67a55a82ce06 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
DeMein 0:67a55a82ce06 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
DeMein 0:67a55a82ce06 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
DeMein 0:67a55a82ce06 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
DeMein 0:67a55a82ce06 20 * THE SOFTWARE.
DeMein 0:67a55a82ce06 21 */
DeMein 0:67a55a82ce06 22
DeMein 0:67a55a82ce06 23 /**
DeMein 0:67a55a82ce06 24 \file pfuncs.cpp
DeMein 0:67a55a82ce06 25 \brief Commands starting with P for processing Parameters
DeMein 0:67a55a82ce06 26 */
DeMein 0:67a55a82ce06 27
DeMein 0:67a55a82ce06 28 #include "pfuncs.h"
DeMein 0:67a55a82ce06 29
DeMein 0:67a55a82ce06 30 string param[maxparams + 1]; // our array of parameter strings
DeMein 0:67a55a82ce06 31
DeMein 0:67a55a82ce06 32 /** translate the parameter character to its array index
DeMein 0:67a55a82ce06 33 *
DeMein 0:67a55a82ce06 34 * @param C parameter character '0' to '9', 'E', etc
DeMein 0:67a55a82ce06 35 * @return index in Parameter array, -1 if C was not valid
DeMein 0:67a55a82ce06 36 *
DeMein 0:67a55a82ce06 37 */
DeMein 0:67a55a82ce06 38 int getpnum(char C) {
DeMein 0:67a55a82ce06 39
DeMein 0:67a55a82ce06 40 switch (C) {
DeMein 0:67a55a82ce06 41 case par_0:
DeMein 0:67a55a82ce06 42 case par_1:
DeMein 0:67a55a82ce06 43 case par_2:
DeMein 0:67a55a82ce06 44 case par_3:
DeMein 0:67a55a82ce06 45 case par_4:
DeMein 0:67a55a82ce06 46 case par_5:
DeMein 0:67a55a82ce06 47 case par_6:
DeMein 0:67a55a82ce06 48 case par_7:
DeMein 0:67a55a82ce06 49 case par_8:
DeMein 0:67a55a82ce06 50 case par_9: return(C - '0');
DeMein 0:67a55a82ce06 51 case par_E: return(10);
DeMein 0:67a55a82ce06 52 case par_R: return(11);
DeMein 0:67a55a82ce06 53 case par_S: return(12);
DeMein 0:67a55a82ce06 54 case par_C: return(13);
DeMein 0:67a55a82ce06 55 case par_X: return(14);
DeMein 0:67a55a82ce06 56 case par_I: return(15);
DeMein 0:67a55a82ce06 57 case par_J: return(16);
DeMein 0:67a55a82ce06 58 case par_H: return(17);
DeMein 0:67a55a82ce06 59 case par_M: return(18);
DeMein 0:67a55a82ce06 60 case par_U: return(19);
DeMein 0:67a55a82ce06 61 case par_N: return(20);
DeMein 0:67a55a82ce06 62 case par_P: return(21);
DeMein 0:67a55a82ce06 63
DeMein 0:67a55a82ce06 64 default: return(-1);
DeMein 0:67a55a82ce06 65 }
DeMein 0:67a55a82ce06 66 }
DeMein 0:67a55a82ce06 67
DeMein 0:67a55a82ce06 68 /** translate the parameter index to its character value
DeMein 0:67a55a82ce06 69 *
DeMein 0:67a55a82ce06 70 * @param pnum index in Parameter array, -1 if C was not valid
DeMein 0:67a55a82ce06 71 * @return parameter character '0' to '9', 'E', etc
DeMein 0:67a55a82ce06 72 *
DeMein 0:67a55a82ce06 73 */
DeMein 0:67a55a82ce06 74 char getnump(int pnum) {
DeMein 0:67a55a82ce06 75 switch (pnum) {
DeMein 0:67a55a82ce06 76 case 0: return('0');
DeMein 0:67a55a82ce06 77 case 1: return('1');
DeMein 0:67a55a82ce06 78 case 2: return('2');
DeMein 0:67a55a82ce06 79 case 3: return('3');
DeMein 0:67a55a82ce06 80 case 4: return('4');
DeMein 0:67a55a82ce06 81 case 5: return('5');
DeMein 0:67a55a82ce06 82 case 6: return('6');
DeMein 0:67a55a82ce06 83 case 7: return('7');
DeMein 0:67a55a82ce06 84 case 8: return('8');
DeMein 0:67a55a82ce06 85 case 9: return('9');
DeMein 0:67a55a82ce06 86 case 10: return('E');
DeMein 0:67a55a82ce06 87 case 11: return('R');
DeMein 0:67a55a82ce06 88 case 12: return('S');
DeMein 0:67a55a82ce06 89 case 13: return('C');
DeMein 0:67a55a82ce06 90 case 14: return('X');
DeMein 0:67a55a82ce06 91 case 15: return('I');
DeMein 0:67a55a82ce06 92 case 16: return('J');
DeMein 0:67a55a82ce06 93 case 17: return('H');
DeMein 0:67a55a82ce06 94 case 18: return('M');
DeMein 0:67a55a82ce06 95 case 19: return('U');
DeMein 0:67a55a82ce06 96 case 20: return('N');
DeMein 0:67a55a82ce06 97 case 21: return('P');
DeMein 0:67a55a82ce06 98 default: return(NULL);
DeMein 0:67a55a82ce06 99 }
DeMein 0:67a55a82ce06 100 }
DeMein 0:67a55a82ce06 101
DeMein 0:67a55a82ce06 102 /** main entry for parsing P-commands
DeMein 0:67a55a82ce06 103 *
DeMein 0:67a55a82ce06 104 */
DeMein 0:67a55a82ce06 105 void parse_P() {
DeMein 0:67a55a82ce06 106 DBG_msg("parse_P", inbuf);
DeMein 0:67a55a82ce06 107
DeMein 0:67a55a82ce06 108 if (inbuf[1] != NULL) {
DeMein 0:67a55a82ce06 109 switch (inbuf[1]) {
DeMein 0:67a55a82ce06 110 case pclear : do_pclear(); // clear parameter
DeMein 0:67a55a82ce06 111 break;
DeMein 0:67a55a82ce06 112 case pget : do_pget(); // get parameter
DeMein 0:67a55a82ce06 113 break;
DeMein 0:67a55a82ce06 114 case pset : do_pset(); // set parameter
DeMein 0:67a55a82ce06 115 break;
DeMein 0:67a55a82ce06 116 case plen : do_plen(); // retrun the length of a parametr string
DeMein 0:67a55a82ce06 117 break;
DeMein 0:67a55a82ce06 118 case psave : do_psave(); // save all parameters to LocalDisk
DeMein 0:67a55a82ce06 119 break;
DeMein 0:67a55a82ce06 120 case pread : do_pread(); // read all parameters from LocalDisk
DeMein 0:67a55a82ce06 121 break;
DeMein 0:67a55a82ce06 122 case pxeq : do_pxeq();
DeMein 0:67a55a82ce06 123 break;
DeMein 0:67a55a82ce06 124 default : do_pdefault(); // command not recognized
DeMein 0:67a55a82ce06 125 break;
DeMein 0:67a55a82ce06 126 }
DeMein 0:67a55a82ce06 127 } else { do_pdefault(); }
DeMein 0:67a55a82ce06 128 }
DeMein 0:67a55a82ce06 129
DeMein 0:67a55a82ce06 130 /** clear a Parameter
DeMein 0:67a55a82ce06 131 *
DeMein 0:67a55a82ce06 132 * syntax: PC [param]
DeMein 0:67a55a82ce06 133 * \n [param]: one of the defined Parameters
DeMein 0:67a55a82ce06 134 *
DeMein 0:67a55a82ce06 135 */
DeMein 0:67a55a82ce06 136 void do_pclear() {
DeMein 0:67a55a82ce06 137 int pnum = 0;
DeMein 0:67a55a82ce06 138
DeMein 0:67a55a82ce06 139 DBG_msg("do_pclear", inbuf);
DeMein 0:67a55a82ce06 140
DeMein 0:67a55a82ce06 141 wipesp(inbuf);
DeMein 0:67a55a82ce06 142 pnum = getpnum(inbuf[2]);
DeMein 0:67a55a82ce06 143 if (pnum >= 0) {
DeMein 0:67a55a82ce06 144 DBG_int("clear parameter #", pnum);
DeMein 0:67a55a82ce06 145 param[pnum].clear();
DeMein 0:67a55a82ce06 146 } else { do_pdefault(); }
DeMein 0:67a55a82ce06 147 }
DeMein 0:67a55a82ce06 148
DeMein 0:67a55a82ce06 149 /** retrieve the value of a parameter
DeMein 0:67a55a82ce06 150 *
DeMein 0:67a55a82ce06 151 * syntax: PG [param]
DeMein 0:67a55a82ce06 152 * \n [param]: one of the defined Parameters
DeMein 0:67a55a82ce06 153 *
DeMein 0:67a55a82ce06 154 */
DeMein 0:67a55a82ce06 155 void do_pget() {
DeMein 0:67a55a82ce06 156 int pnum = 0;
DeMein 0:67a55a82ce06 157 char * cstr;
DeMein 0:67a55a82ce06 158
DeMein 0:67a55a82ce06 159 DBG_msg("do_pget", inbuf);
DeMein 0:67a55a82ce06 160
DeMein 0:67a55a82ce06 161 wipesp(inbuf);
DeMein 0:67a55a82ce06 162 pnum = getpnum(inbuf[2]);
DeMein 0:67a55a82ce06 163 if (pnum >= 0) {
DeMein 0:67a55a82ce06 164 cstr = new char [param[pnum].size() + 1];
DeMein 0:67a55a82ce06 165 strcpy (cstr, param[pnum].c_str());
DeMein 0:67a55a82ce06 166 DBG_int("get parameter #", pnum);
DeMein 0:67a55a82ce06 167 DBG_msg("get parameter: ", cstr);
DeMein 0:67a55a82ce06 168 upstring(cstr);
DeMein 0:67a55a82ce06 169 mldl.tx_string(cstr);
DeMein 0:67a55a82ce06 170 delete[] cstr;
DeMein 0:67a55a82ce06 171 } else { do_pdefault(); }
DeMein 0:67a55a82ce06 172 }
DeMein 0:67a55a82ce06 173
DeMein 0:67a55a82ce06 174 /** set the value of a parameter
DeMein 0:67a55a82ce06 175 *
DeMein 0:67a55a82ce06 176 * syntax: PS [param][string] overwrites previous Parameter
DeMein 0:67a55a82ce06 177 * \n or PS [param]>+[string] to append to Parameter
DeMein 0:67a55a82ce06 178 * \n [param]: one of the defined Parameters
DeMein 0:67a55a82ce06 179 *
DeMein 0:67a55a82ce06 180 */
DeMein 0:67a55a82ce06 181 void do_pset() {
DeMein 0:67a55a82ce06 182 int pnum = 0;
DeMein 0:67a55a82ce06 183
DeMein 0:67a55a82ce06 184 DBG_msg("do_pset", inbuf);
DeMein 0:67a55a82ce06 185
DeMein 0:67a55a82ce06 186 while (inbuf[2] == c_space) remchar(inbuf, 2, 1); // remove the spaces
DeMein 0:67a55a82ce06 187
DeMein 0:67a55a82ce06 188 pnum = getpnum(inbuf[2]);
DeMein 0:67a55a82ce06 189 DBG_int("pnum", pnum);
DeMein 0:67a55a82ce06 190 if (pnum >= 0) {
DeMein 0:67a55a82ce06 191 // now retrieve string from the command line, i starts at 3
DeMein 0:67a55a82ce06 192 DBG_int("set parameter #", pnum);
DeMein 0:67a55a82ce06 193
DeMein 0:67a55a82ce06 194 // if first chars are not ">+" the string will be new
DeMein 0:67a55a82ce06 195 if ((inbuf[3] == c_escape) && (inbuf[4] == c_append)) {
DeMein 0:67a55a82ce06 196 // string is append, remove first 5 chars (command and >+) from inbuf
DeMein 0:67a55a82ce06 197 remchar(inbuf, 0, 5);
DeMein 0:67a55a82ce06 198 DBG_msg("append parameter ", inbuf);
DeMein 0:67a55a82ce06 199 param[pnum].append(inbuf);
DeMein 0:67a55a82ce06 200 } else {
DeMein 0:67a55a82ce06 201 remchar(inbuf, 0, 3);
DeMein 0:67a55a82ce06 202 DBG_msg("new parameter ", inbuf);
DeMein 0:67a55a82ce06 203 param[pnum].assign(inbuf); // no append, assign string
DeMein 0:67a55a82ce06 204 }
DeMein 0:67a55a82ce06 205 } else { do_pdefault(); }
DeMein 0:67a55a82ce06 206 }
DeMein 0:67a55a82ce06 207
DeMein 0:67a55a82ce06 208 /** return the length of a parameter string
DeMein 0:67a55a82ce06 209 *
DeMein 0:67a55a82ce06 210 * syntax: PL [param]
DeMein 0:67a55a82ce06 211 * \n [param]: one of the defined Parameters
DeMein 0:67a55a82ce06 212 *
DeMein 0:67a55a82ce06 213 */
DeMein 0:67a55a82ce06 214 void do_plen() {
DeMein 0:67a55a82ce06 215 int pnum = 0;
DeMein 0:67a55a82ce06 216 char tmp[25];
DeMein 0:67a55a82ce06 217
DeMein 0:67a55a82ce06 218 DBG_msg("do_plen", inbuf);
DeMein 0:67a55a82ce06 219
DeMein 0:67a55a82ce06 220 wipesp(inbuf);
DeMein 0:67a55a82ce06 221 pnum = getpnum(inbuf[2]);
DeMein 0:67a55a82ce06 222 if (pnum >= 0) {
DeMein 0:67a55a82ce06 223 DBG_int("parameter #", pnum);
DeMein 0:67a55a82ce06 224 sprintf(tmp,"%d", param[pnum].length());
DeMein 0:67a55a82ce06 225 DBG_msg("parameter length ", tmp);
DeMein 0:67a55a82ce06 226 mldl.tx_string(tmp);
DeMein 0:67a55a82ce06 227 } else { do_pdefault(); }
DeMein 0:67a55a82ce06 228 }
DeMein 0:67a55a82ce06 229
DeMein 0:67a55a82ce06 230 /** save all parameters to LocalDisk, with filename PARAMS_[num].TXT
DeMein 0:67a55a82ce06 231 *
DeMein 0:67a55a82ce06 232 * syntax: PV [num]
DeMein 0:67a55a82ce06 233 * \n [num]: simngle digit or character
DeMein 0:67a55a82ce06 234 * \n overwrites an existing file
DeMein 0:67a55a82ce06 235
DeMein 0:67a55a82ce06 236 */
DeMein 0:67a55a82ce06 237 void do_psave() {
DeMein 0:67a55a82ce06 238 int pnum = 0;
DeMein 0:67a55a82ce06 239 char fname[25];
DeMein 0:67a55a82ce06 240 char * cstr;
DeMein 0:67a55a82ce06 241
DeMein 0:67a55a82ce06 242 DBG_msg("do_psave", inbuf);
DeMein 0:67a55a82ce06 243
DeMein 0:67a55a82ce06 244 wipesp(inbuf);
DeMein 0:67a55a82ce06 245
DeMein 0:67a55a82ce06 246 if (inbuf[2] != NULL) {
DeMein 0:67a55a82ce06 247 sprintf(fname, "/local/param_%c.txt", inbuf[2]);
DeMein 0:67a55a82ce06 248 DBG_msg("create file ", fname);
DeMein 0:67a55a82ce06 249 FILE *fp = fopen(fname, "w"); // Open file for writing
DeMein 0:67a55a82ce06 250 if (fp != NULL) {
DeMein 0:67a55a82ce06 251 for (pnum = 0; pnum <= maxparams; pnum++) {
DeMein 0:67a55a82ce06 252 cstr = new char [param[pnum].size() + 1];
DeMein 0:67a55a82ce06 253 sprintf(cstr, "%c-", getnump(pnum));
DeMein 0:67a55a82ce06 254 strcat (cstr, param[pnum].c_str());
DeMein 0:67a55a82ce06 255 DBG_msg("saving ", cstr);
DeMein 0:67a55a82ce06 256 fprintf(fp, "%s\n", cstr);
DeMein 0:67a55a82ce06 257 delete[] cstr;
DeMein 0:67a55a82ce06 258 }
DeMein 0:67a55a82ce06 259 fclose(fp);
DeMein 0:67a55a82ce06 260 } else {
DeMein 0:67a55a82ce06 261 // error opening file
DeMein 0:67a55a82ce06 262 DBG_msg("do_psave", "file NOT opened");
DeMein 0:67a55a82ce06 263 send_error(err_filenotopen);
DeMein 0:67a55a82ce06 264 }
DeMein 0:67a55a82ce06 265 } else {
DeMein 0:67a55a82ce06 266 DBG_msg("do_psave", inbuf);
DeMein 0:67a55a82ce06 267 send_error(err_novalidcommand);
DeMein 0:67a55a82ce06 268 }
DeMein 0:67a55a82ce06 269 }
DeMein 0:67a55a82ce06 270
DeMein 0:67a55a82ce06 271 /** read all parameters from LocalDisk, with filename PARAMS_[num].TXT
DeMein 0:67a55a82ce06 272 *
DeMein 0:67a55a82ce06 273 * syntax: PR [num]
DeMein 0:67a55a82ce06 274 * \n [num]: single digit or character
DeMein 0:67a55a82ce06 275 *
DeMein 0:67a55a82ce06 276 */
DeMein 0:67a55a82ce06 277 void do_pread() {
DeMein 0:67a55a82ce06 278 int pnum = 0;
DeMein 0:67a55a82ce06 279 char fname[25];
DeMein 0:67a55a82ce06 280 char cstr[511]; // maximum length per parameter
DeMein 0:67a55a82ce06 281
DeMein 0:67a55a82ce06 282 DBG_msg("do_pread", inbuf);
DeMein 0:67a55a82ce06 283
DeMein 0:67a55a82ce06 284 wipesp(inbuf);
DeMein 0:67a55a82ce06 285
DeMein 0:67a55a82ce06 286 if (inbuf[2] != NULL) {
DeMein 0:67a55a82ce06 287 sprintf(fname, "/local/param_%c.txt", inbuf[2]);
DeMein 0:67a55a82ce06 288 DBG_msg("open file ", fname);
DeMein 0:67a55a82ce06 289 FILE *fp = fopen(fname, "r"); // Open file for reading
DeMein 0:67a55a82ce06 290 if (fp != NULL) {
DeMein 0:67a55a82ce06 291 for (pnum = 0; pnum <= maxparams; pnum++) {
DeMein 0:67a55a82ce06 292 DBG_int("param ", pnum);
DeMein 0:67a55a82ce06 293 fgets(cstr, 511, fp);
DeMein 0:67a55a82ce06 294 DBG_msg("read ", cstr);
DeMein 0:67a55a82ce06 295 remchar(cstr, 0, 2); // remove the firs 2 chars (parameter char)
DeMein 0:67a55a82ce06 296 param[pnum].assign(cstr);
DeMein 0:67a55a82ce06 297 param[pnum].erase(param[pnum].end() - 1); // remove /n
DeMein 0:67a55a82ce06 298 }
DeMein 0:67a55a82ce06 299 fclose(fp);
DeMein 0:67a55a82ce06 300 } else {
DeMein 0:67a55a82ce06 301 // error opening file
DeMein 0:67a55a82ce06 302 DBG_msg("do_pread", "file NOT opened");
DeMein 0:67a55a82ce06 303 send_error(err_filenotopen);
DeMein 0:67a55a82ce06 304 }
DeMein 0:67a55a82ce06 305 } else {
DeMein 0:67a55a82ce06 306 DBG_msg("do_pread", inbuf);
DeMein 0:67a55a82ce06 307 send_error(err_novalidcommand);
DeMein 0:67a55a82ce06 308 }
DeMein 0:67a55a82ce06 309 }
DeMein 0:67a55a82ce06 310
DeMein 0:67a55a82ce06 311 /** Execute the chosen parameter string as an MMEx command
DeMein 0:67a55a82ce06 312 *
DeMein 0:67a55a82ce06 313 * syntax: PX [param]
DeMein 0:67a55a82ce06 314 * \n [param]: one of the defined Parameters
DeMein 0:67a55a82ce06 315 *
DeMein 0:67a55a82ce06 316 */
DeMein 0:67a55a82ce06 317 void do_pxeq() {
DeMein 0:67a55a82ce06 318 int pnum = 0;
DeMein 0:67a55a82ce06 319 int i;
DeMein 0:67a55a82ce06 320 char * cstr;
DeMein 0:67a55a82ce06 321
DeMein 0:67a55a82ce06 322 DBG_msg("do_pxeq", inbuf);
DeMein 0:67a55a82ce06 323
DeMein 0:67a55a82ce06 324 wipesp(inbuf);
DeMein 0:67a55a82ce06 325 pnum = getpnum(inbuf[2]);
DeMein 0:67a55a82ce06 326 if (((pnum >= 0) && (pnum <= 9)) || (pnum == par_C_) || (pnum == par_X_)) {
DeMein 0:67a55a82ce06 327 // only for valid parameters
DeMein 0:67a55a82ce06 328 cstr = new char [param[pnum].size() + 1];
DeMein 0:67a55a82ce06 329 strcpy (cstr, param[pnum].c_str());
DeMein 0:67a55a82ce06 330 DBG_int("xeq parameter #", pnum);
DeMein 0:67a55a82ce06 331 DBG_msg("xeq parameter: ", cstr);
DeMein 0:67a55a82ce06 332
DeMein 0:67a55a82ce06 333 if (mldl.rx_room() >= (param[pnum].length() + 1)) {
DeMein 0:67a55a82ce06 334 DBG_int("init XQ", mldl.rx_room());
DeMein 0:67a55a82ce06 335 // enough room in our rx buffer
DeMein 0:67a55a82ce06 336 i = 0;
DeMein 0:67a55a82ce06 337 while (cstr[i] != NULL) {
DeMein 0:67a55a82ce06 338 // add to buffer
DeMein 0:67a55a82ce06 339 mldl.rx_add(cstr[i]);
DeMein 0:67a55a82ce06 340 DBG_chr("XQ add", cstr[i]);
DeMein 0:67a55a82ce06 341 i++;
DeMein 0:67a55a82ce06 342 }
DeMein 0:67a55a82ce06 343 mldl.rx_add(c_cr);
DeMein 0:67a55a82ce06 344 } else {
DeMein 0:67a55a82ce06 345 // not enough room
DeMein 0:67a55a82ce06 346 DBG_msg("do_pxeq", "rx buffer full");
DeMein 0:67a55a82ce06 347 send_error(err_paramnoxeq);
DeMein 0:67a55a82ce06 348 }
DeMein 0:67a55a82ce06 349 delete[] cstr;
DeMein 0:67a55a82ce06 350 } else {
DeMein 0:67a55a82ce06 351 if (pnum == par_R_) {
DeMein 0:67a55a82ce06 352 // RPC function to execute
DeMein 0:67a55a82ce06 353 do_pdefault();
DeMein 0:67a55a82ce06 354 } else { do_pdefault(); }
DeMein 0:67a55a82ce06 355 }
DeMein 0:67a55a82ce06 356 }
DeMein 0:67a55a82ce06 357
DeMein 0:67a55a82ce06 358 /** automatic all parameters from LocalDisk on startup, with filename PARAMS_A.TXT
DeMein 0:67a55a82ce06 359 *
DeMein 0:67a55a82ce06 360 */
DeMein 0:67a55a82ce06 361 void init_loadp() {
DeMein 0:67a55a82ce06 362 int pnum = 0;
DeMein 0:67a55a82ce06 363 char cstr[511]; // maximum length per parameter
DeMein 0:67a55a82ce06 364
DeMein 0:67a55a82ce06 365 DBG_msg("init_loadp", "PARAM_A.TXT");
DeMein 0:67a55a82ce06 366
DeMein 0:67a55a82ce06 367 FILE *fp = fopen("/local/PARAM_A.TXT", "r"); // Open file for reading
DeMein 0:67a55a82ce06 368 if (fp != NULL) {
DeMein 0:67a55a82ce06 369 for (pnum = 0; pnum <= maxparams; pnum++) {
DeMein 0:67a55a82ce06 370 DBG_int("param ", pnum);
DeMein 0:67a55a82ce06 371 fgets(cstr, 511, fp);
DeMein 0:67a55a82ce06 372 DBG_msg("read ", cstr);
DeMein 0:67a55a82ce06 373 remchar(cstr, 0, 2); // remove the firs 2 chars (parameter char)
DeMein 0:67a55a82ce06 374 param[pnum].assign(cstr);
DeMein 0:67a55a82ce06 375 param[pnum].erase(param[pnum].end() - 1); // remove /n
DeMein 0:67a55a82ce06 376 }
DeMein 0:67a55a82ce06 377 fclose(fp);
DeMein 0:67a55a82ce06 378 } else {
DeMein 0:67a55a82ce06 379 // error opening file
DeMein 0:67a55a82ce06 380 DBG_msg("file not found", "PARAM_A.TXT");
DeMein 0:67a55a82ce06 381 // send_error(err_filenotopen); // no error sent on startup
DeMein 0:67a55a82ce06 382 }
DeMein 0:67a55a82ce06 383 }
DeMein 0:67a55a82ce06 384
DeMein 0:67a55a82ce06 385 /** execute the auto execute string in Parameter X on startup if it exists
DeMein 0:67a55a82ce06 386 *
DeMein 0:67a55a82ce06 387 */
DeMein 0:67a55a82ce06 388 void init_xeq() {
DeMein 0:67a55a82ce06 389 int pnum = 0;
DeMein 0:67a55a82ce06 390 int i;
DeMein 0:67a55a82ce06 391 char * cstr;
DeMein 0:67a55a82ce06 392
DeMein 0:67a55a82ce06 393 DBG_msg("init_xeq", "parameter X");
DeMein 0:67a55a82ce06 394
DeMein 0:67a55a82ce06 395 pnum = getpnum('X');
DeMein 0:67a55a82ce06 396 if (pnum >= 0) {
DeMein 0:67a55a82ce06 397 cstr = new char [param[pnum].size() + 1];
DeMein 0:67a55a82ce06 398 strcpy (cstr, param[pnum].c_str());
DeMein 0:67a55a82ce06 399 DBG_int("xeq parameter #", pnum);
DeMein 0:67a55a82ce06 400 DBG_msg("xeq parameter: ", cstr);
DeMein 0:67a55a82ce06 401
DeMein 0:67a55a82ce06 402
DeMein 0:67a55a82ce06 403 if ((mldl.rx_room() >= param[pnum].length() + 1) && !param[pnum].empty()) {
DeMein 0:67a55a82ce06 404 // enough room in our rx buffer and we have something to execute
DeMein 0:67a55a82ce06 405 DBG_int("init XQ", mldl.rx_room());
DeMein 0:67a55a82ce06 406 i = 0;
DeMein 0:67a55a82ce06 407 while (cstr[i] != NULL) {
DeMein 0:67a55a82ce06 408 // add to buffer
DeMein 0:67a55a82ce06 409 mldl.rx_add(cstr[i]);
DeMein 0:67a55a82ce06 410 DBG_chr("XQI add", cstr[i]);
DeMein 0:67a55a82ce06 411 i++;
DeMein 0:67a55a82ce06 412 }
DeMein 0:67a55a82ce06 413 mldl.rx_add(c_cr);
DeMein 0:67a55a82ce06 414 } else {
DeMein 0:67a55a82ce06 415 // not enough room
DeMein 0:67a55a82ce06 416 DBG_msg("init_xeq", "rx buffer full or no command");
DeMein 0:67a55a82ce06 417 }
DeMein 0:67a55a82ce06 418 delete[] cstr;
DeMein 0:67a55a82ce06 419 }
DeMein 0:67a55a82ce06 420 }
DeMein 0:67a55a82ce06 421
DeMein 0:67a55a82ce06 422 /** send error message, command not recognized
DeMein 0:67a55a82ce06 423 *
DeMein 0:67a55a82ce06 424 */
DeMein 0:67a55a82ce06 425 void do_pdefault() {
DeMein 0:67a55a82ce06 426 DBG_msg("do_pdefault", inbuf);
DeMein 0:67a55a82ce06 427 send_error(err_notrecognized);
DeMein 0:67a55a82ce06 428 }