library to modify and read program variable in runtime from a serial console. You can reset as well the mbed from the console without pushing buttons. Handy for debugging from the online compiler as you can change the behavior of the program without need to recompile each time.

Committer:
julmbed
Date:
Tue Aug 26 08:20:02 2014 +0000
Revision:
12:e9c8d2d9ac71
Parent:
10:34d368966675
Child:
13:e1ba5bf9e51f
using new and variable number of variables

Who changed what in which revision?

UserRevisionLine numberNew contents of line
julmbed 0:85afbf3c9fad 1
julmbed 0:85afbf3c9fad 2 #include <string.h>
julmbed 0:85afbf3c9fad 3 #include <stdio.h>
julmbed 0:85afbf3c9fad 4 #include "mbed.h"
julmbed 0:85afbf3c9fad 5 #include "rtos.h"
julmbed 8:934ec53fe2c0 6
julmbed 0:85afbf3c9fad 7
julmbed 2:a59207652720 8 extern "C" void mbed_reset();
julmbed 2:a59207652720 9
julmbed 0:85afbf3c9fad 10 #include "VarStore.h"
julmbed 0:85afbf3c9fad 11
julmbed 0:85afbf3c9fad 12 #define CI_SZ 100
julmbed 0:85afbf3c9fad 13
julmbed 0:85afbf3c9fad 14 /*******************************
julmbed 0:85afbf3c9fad 15 *
julmbed 0:85afbf3c9fad 16 *
julmbed 0:85afbf3c9fad 17 ********************************/
julmbed 12:e9c8d2d9ac71 18 VarStore::VarStore( RawSerial *ser, int sz)
julmbed 0:85afbf3c9fad 19 {
julmbed 0:85afbf3c9fad 20 VarCounter=0;
julmbed 8:934ec53fe2c0 21 this->pc=ser;
julmbed 12:e9c8d2d9ac71 22 this->sz=sz;
julmbed 12:e9c8d2d9ac71 23 //Store=(VarItem *) malloc( sizeof(VarItem)*sz);
julmbed 12:e9c8d2d9ac71 24 Store=new VarItem[sz];
julmbed 0:85afbf3c9fad 25 }
julmbed 0:85afbf3c9fad 26
julmbed 0:85afbf3c9fad 27 /*******************************
julmbed 0:85afbf3c9fad 28 *
julmbed 0:85afbf3c9fad 29 *
julmbed 0:85afbf3c9fad 30 ********************************/
julmbed 0:85afbf3c9fad 31
julmbed 0:85afbf3c9fad 32 VarStore::~VarStore()
julmbed 0:85afbf3c9fad 33 {
julmbed 0:85afbf3c9fad 34 //dtor
julmbed 0:85afbf3c9fad 35 }
julmbed 0:85afbf3c9fad 36
julmbed 0:85afbf3c9fad 37 /*******************************
julmbed 0:85afbf3c9fad 38 *
julmbed 0:85afbf3c9fad 39 *
julmbed 0:85afbf3c9fad 40 ********************************/
julmbed 0:85afbf3c9fad 41
julmbed 2:a59207652720 42 char *VarStore::Set(char *Input)
julmbed 0:85afbf3c9fad 43 {
julmbed 0:85afbf3c9fad 44 VarItem *V;
julmbed 0:85afbf3c9fad 45 char *Name;
julmbed 0:85afbf3c9fad 46
julmbed 8:934ec53fe2c0 47 // beaware of puts pc->printf("VarStore Set %s\n",Input);
julmbed 8:934ec53fe2c0 48
julmbed 0:85afbf3c9fad 49 if(Input [0] == 's') {
julmbed 0:85afbf3c9fad 50 strtok(Input,":");
julmbed 0:85afbf3c9fad 51 Name=strtok(NULL,":");
julmbed 0:85afbf3c9fad 52 if((V=GetVar(Name)) != NULL)
julmbed 2:a59207652720 53 return V->SetVal(strtok(NULL,":"))!= ERR ? Input : NULL;
julmbed 0:85afbf3c9fad 54 }
julmbed 2:a59207652720 55 return NULL;
julmbed 0:85afbf3c9fad 56 }
julmbed 0:85afbf3c9fad 57
julmbed 0:85afbf3c9fad 58 /*******************************
julmbed 0:85afbf3c9fad 59 *
julmbed 0:85afbf3c9fad 60 *
julmbed 0:85afbf3c9fad 61 ********************************/
julmbed 0:85afbf3c9fad 62
julmbed 0:85afbf3c9fad 63
julmbed 0:85afbf3c9fad 64 int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType )
julmbed 0:85afbf3c9fad 65 {
julmbed 0:85afbf3c9fad 66 return Load(Name, VarPtr,VarType,0 );
julmbed 0:85afbf3c9fad 67 }
julmbed 0:85afbf3c9fad 68
julmbed 0:85afbf3c9fad 69 /*******************************
julmbed 0:85afbf3c9fad 70 *
julmbed 0:85afbf3c9fad 71 *
julmbed 0:85afbf3c9fad 72 ********************************/
julmbed 0:85afbf3c9fad 73
julmbed 0:85afbf3c9fad 74 int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType, int Size )
julmbed 0:85afbf3c9fad 75 {
julmbed 12:e9c8d2d9ac71 76 pc->puts("Entro en Load \n");
julmbed 0:85afbf3c9fad 77 if(GetVar(Name) ==NULL) {
julmbed 12:e9c8d2d9ac71 78 pc->puts("variable no esta \n");
julmbed 12:e9c8d2d9ac71 79 if(VarCounter < sz) {
julmbed 12:e9c8d2d9ac71 80 pc->puts("incorporo variable a Store \n");
julmbed 0:85afbf3c9fad 81 Store[VarCounter].SetVar(VarType,VarPtr);
julmbed 0:85afbf3c9fad 82 Store[VarCounter].SetVarName(Name);
julmbed 0:85afbf3c9fad 83 Store[VarCounter].SetVarArraySize(Size);
julmbed 0:85afbf3c9fad 84 VarCounter++;
julmbed 12:e9c8d2d9ac71 85 pc->puts("salgo por NULL \n");
julmbed 12:e9c8d2d9ac71 86 return NULL;
julmbed 0:85afbf3c9fad 87 }
julmbed 0:85afbf3c9fad 88 }
julmbed 12:e9c8d2d9ac71 89 pc->puts("salgo por error \n");
julmbed 0:85afbf3c9fad 90 return ERR;
julmbed 0:85afbf3c9fad 91 }
julmbed 0:85afbf3c9fad 92
julmbed 0:85afbf3c9fad 93 /*******************************
julmbed 0:85afbf3c9fad 94 *
julmbed 0:85afbf3c9fad 95 *
julmbed 0:85afbf3c9fad 96 ********************************/
julmbed 0:85afbf3c9fad 97
julmbed 0:85afbf3c9fad 98 VarItem *VarStore::GetVar(char *Name)
julmbed 0:85afbf3c9fad 99 {
julmbed 12:e9c8d2d9ac71 100 for (int i=0; i<sz; i++)
julmbed 0:85afbf3c9fad 101 if((strcmp(Name,Store[i].GetVarName()))==0)
julmbed 0:85afbf3c9fad 102 return &Store[i];
julmbed 0:85afbf3c9fad 103
julmbed 0:85afbf3c9fad 104 return NULL;
julmbed 0:85afbf3c9fad 105 }
julmbed 0:85afbf3c9fad 106
julmbed 0:85afbf3c9fad 107 char* VarStore::Get(char *Name)
julmbed 0:85afbf3c9fad 108 {
julmbed 0:85afbf3c9fad 109 VarItem *V;
julmbed 8:934ec53fe2c0 110 V=GetVar(Name);
julmbed 9:d081aa4e4418 111 if(V!=NULL)
julmbed 9:d081aa4e4418 112 return V->Dump();
julmbed 9:d081aa4e4418 113 else
julmbed 0:85afbf3c9fad 114 return NULL;
julmbed 0:85afbf3c9fad 115 }
julmbed 0:85afbf3c9fad 116
julmbed 0:85afbf3c9fad 117 /*******************************
julmbed 0:85afbf3c9fad 118 *
julmbed 0:85afbf3c9fad 119 *
julmbed 0:85afbf3c9fad 120 ********************************/
julmbed 0:85afbf3c9fad 121
julmbed 7:fafe81a95c08 122
julmbed 10:34d368966675 123 void VarStore::Worker2()
julmbed 0:85afbf3c9fad 124 {
julmbed 8:934ec53fe2c0 125
julmbed 6:9848fdaf2ad9 126 static char c, *ret=STR_OK;// not NULL to start in no error state
julmbed 8:934ec53fe2c0 127
julmbed 6:9848fdaf2ad9 128 static int ci_counter=0;
julmbed 6:9848fdaf2ad9 129 static char Cs[CI_SZ];
julmbed 8:934ec53fe2c0 130 if(VarStore::MyThis->pc->readable()) {
julmbed 8:934ec53fe2c0 131 c=VarStore::MyThis->pc->getc();
julmbed 2:a59207652720 132
julmbed 8:934ec53fe2c0 133 if(ci_counter >= CI_SZ-1) { // RESET
julmbed 8:934ec53fe2c0 134 ci_counter=0;
julmbed 8:934ec53fe2c0 135 Cs[0]='\0';
julmbed 8:934ec53fe2c0 136 } else {
julmbed 8:934ec53fe2c0 137 if(c=='\r') {
julmbed 8:934ec53fe2c0 138 Cs[ci_counter]='\0';
julmbed 8:934ec53fe2c0 139 ret=VarStore::MyThis->Do(Cs);
julmbed 0:85afbf3c9fad 140 ci_counter=0;
julmbed 0:85afbf3c9fad 141 Cs[0]='\0';
julmbed 0:85afbf3c9fad 142 } else {
julmbed 8:934ec53fe2c0 143 Cs[ci_counter]=c;
julmbed 8:934ec53fe2c0 144 ci_counter++;
julmbed 0:85afbf3c9fad 145 }
julmbed 0:85afbf3c9fad 146 }
julmbed 8:934ec53fe2c0 147 }
julmbed 0:85afbf3c9fad 148
julmbed 8:934ec53fe2c0 149 if(ret==NULL) {
julmbed 8:934ec53fe2c0 150 VarStore::MyThis->pc->puts(" error setting/getting var \n");
julmbed 8:934ec53fe2c0 151 ret=STR_OK;
julmbed 8:934ec53fe2c0 152 }
julmbed 8:934ec53fe2c0 153
julmbed 0:85afbf3c9fad 154 }
julmbed 0:85afbf3c9fad 155
julmbed 0:85afbf3c9fad 156 /*******************************
julmbed 0:85afbf3c9fad 157 *
julmbed 0:85afbf3c9fad 158 *
julmbed 0:85afbf3c9fad 159 ********************************/
julmbed 6:9848fdaf2ad9 160
julmbed 8:934ec53fe2c0 161 VarStore *VarStore::MyThis=NULL; // used by the worker reading the terminal. Need to be initilized this way to avoid
julmbed 8:934ec53fe2c0 162 // compiling errors
julmbed 5:47b67a7c0bb7 163 void VarStore::Worker(void const *args)
julmbed 5:47b67a7c0bb7 164 {
julmbed 5:47b67a7c0bb7 165
julmbed 5:47b67a7c0bb7 166 VarStore::MyThis=(VarStore *)args;
julmbed 5:47b67a7c0bb7 167
julmbed 8:934ec53fe2c0 168 // cuidado puts VarStore::MyThis->pc->(" hi worker 1\n");
julmbed 8:934ec53fe2c0 169
julmbed 10:34d368966675 170 VarStore::MyThis->pc->attach(&VarStore::Worker2);
julmbed 5:47b67a7c0bb7 171
julmbed 5:47b67a7c0bb7 172 while(1) {
julmbed 6:9848fdaf2ad9 173 Thread::wait(1000);
julmbed 5:47b67a7c0bb7 174 }
julmbed 5:47b67a7c0bb7 175
julmbed 5:47b67a7c0bb7 176 }
julmbed 5:47b67a7c0bb7 177 /*******************************
julmbed 5:47b67a7c0bb7 178 *
julmbed 5:47b67a7c0bb7 179 *
julmbed 5:47b67a7c0bb7 180 ********************************/
julmbed 0:85afbf3c9fad 181
julmbed 7:fafe81a95c08 182 char *VarStore::Do(char *str)
julmbed 2:a59207652720 183 {
julmbed 2:a59207652720 184 char *ret;
julmbed 2:a59207652720 185 if(str != NULL) {
julmbed 2:a59207652720 186
julmbed 2:a59207652720 187 switch(*str) {
julmbed 2:a59207652720 188 case 's':
julmbed 6:9848fdaf2ad9 189 return VarStore::MyThis->Set(str);
julmbed 2:a59207652720 190 case 'd':
julmbed 8:934ec53fe2c0 191
julmbed 9:d081aa4e4418 192 VarStore::MyThis->pc->puts(str);
julmbed 9:d081aa4e4418 193 VarStore::MyThis->pc->putc('\n');
julmbed 9:d081aa4e4418 194
julmbed 8:934ec53fe2c0 195 ret=strtok(str,":");
julmbed 8:934ec53fe2c0 196 ret=strtok(NULL,":");
julmbed 8:934ec53fe2c0 197
julmbed 8:934ec53fe2c0 198 ret=VarStore::MyThis->Get(ret);
julmbed 8:934ec53fe2c0 199
julmbed 2:a59207652720 200 if(ret!=NULL) {
julmbed 9:d081aa4e4418 201 VarStore::MyThis->pc->puts(ret);
julmbed 9:d081aa4e4418 202 VarStore::MyThis->pc->putc('\n');
julmbed 2:a59207652720 203 return ret;
julmbed 2:a59207652720 204 } else
julmbed 2:a59207652720 205 return NULL;
julmbed 2:a59207652720 206 case 'r':
julmbed 2:a59207652720 207 mbed_reset();
julmbed 2:a59207652720 208 return NULL;
julmbed 3:cf43e6de918e 209 case 'w':
julmbed 3:cf43e6de918e 210 strtok(str,":");
julmbed 3:cf43e6de918e 211 Thread::wait(atoi(strtok(NULL,":")));
julmbed 3:cf43e6de918e 212 return STR_OK;
julmbed 2:a59207652720 213 };
julmbed 2:a59207652720 214 }
julmbed 2:a59207652720 215 return NULL;
julmbed 2:a59207652720 216 }
julmbed 2:a59207652720 217