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:
Mon Aug 25 12:39:23 2014 +0000
Revision:
4:4be2eaf872df
Parent:
3:cf43e6de918e
Child:
5:47b67a7c0bb7
quitando el wait del thread worker

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 0:85afbf3c9fad 6
julmbed 2:a59207652720 7 extern "C" void mbed_reset();
julmbed 2:a59207652720 8
julmbed 0:85afbf3c9fad 9 #include "VarStore.h"
julmbed 0:85afbf3c9fad 10
julmbed 0:85afbf3c9fad 11 #define CI_SZ 100
julmbed 0:85afbf3c9fad 12
julmbed 0:85afbf3c9fad 13 /*******************************
julmbed 0:85afbf3c9fad 14 *
julmbed 0:85afbf3c9fad 15 *
julmbed 0:85afbf3c9fad 16 ********************************/
julmbed 0:85afbf3c9fad 17 VarStore::VarStore(Serial *ser)
julmbed 0:85afbf3c9fad 18 {
julmbed 0:85afbf3c9fad 19 VarCounter=0;
julmbed 0:85afbf3c9fad 20 this->pc=ser;
julmbed 2:a59207652720 21 // doesn't work.... Thread thread(VarStore::Worker,this,osPriorityNormal,DEFAULT_STACK_SIZE,NULL);
julmbed 2:a59207652720 22
julmbed 0:85afbf3c9fad 23 }
julmbed 0:85afbf3c9fad 24
julmbed 0:85afbf3c9fad 25 /*******************************
julmbed 0:85afbf3c9fad 26 *
julmbed 0:85afbf3c9fad 27 *
julmbed 0:85afbf3c9fad 28 ********************************/
julmbed 0:85afbf3c9fad 29
julmbed 0:85afbf3c9fad 30 VarStore::~VarStore()
julmbed 0:85afbf3c9fad 31 {
julmbed 0:85afbf3c9fad 32 //dtor
julmbed 0:85afbf3c9fad 33 }
julmbed 0:85afbf3c9fad 34
julmbed 0:85afbf3c9fad 35 /*******************************
julmbed 0:85afbf3c9fad 36 *
julmbed 0:85afbf3c9fad 37 *
julmbed 0:85afbf3c9fad 38 ********************************/
julmbed 0:85afbf3c9fad 39
julmbed 2:a59207652720 40 char *VarStore::Set(char *Input)
julmbed 0:85afbf3c9fad 41 {
julmbed 0:85afbf3c9fad 42 VarItem *V;
julmbed 0:85afbf3c9fad 43 char *Name;
julmbed 0:85afbf3c9fad 44
julmbed 4:4be2eaf872df 45 pc->printf("VarStore Set %s\n",Input);
julmbed 4:4be2eaf872df 46
julmbed 0:85afbf3c9fad 47 if(Input [0] == 's') {
julmbed 0:85afbf3c9fad 48 strtok(Input,":");
julmbed 0:85afbf3c9fad 49 Name=strtok(NULL,":");
julmbed 0:85afbf3c9fad 50 if((V=GetVar(Name)) != NULL)
julmbed 2:a59207652720 51 return V->SetVal(strtok(NULL,":"))!= ERR ? Input : NULL;
julmbed 0:85afbf3c9fad 52 }
julmbed 2:a59207652720 53 return NULL;
julmbed 0:85afbf3c9fad 54 }
julmbed 0:85afbf3c9fad 55
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 int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType )
julmbed 0:85afbf3c9fad 63 {
julmbed 0:85afbf3c9fad 64 return Load(Name, VarPtr,VarType,0 );
julmbed 0:85afbf3c9fad 65 }
julmbed 0:85afbf3c9fad 66
julmbed 0:85afbf3c9fad 67 /*******************************
julmbed 0:85afbf3c9fad 68 *
julmbed 0:85afbf3c9fad 69 *
julmbed 0:85afbf3c9fad 70 ********************************/
julmbed 0:85afbf3c9fad 71
julmbed 0:85afbf3c9fad 72 int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType, int Size )
julmbed 0:85afbf3c9fad 73 {
julmbed 0:85afbf3c9fad 74
julmbed 0:85afbf3c9fad 75 if(GetVar(Name) ==NULL) {
julmbed 0:85afbf3c9fad 76 if(VarCounter < SZ) {
julmbed 0:85afbf3c9fad 77 Store[VarCounter].SetVar(VarType,VarPtr);
julmbed 0:85afbf3c9fad 78 Store[VarCounter].SetVarName(Name);
julmbed 0:85afbf3c9fad 79 Store[VarCounter].SetVarArraySize(Size);
julmbed 0:85afbf3c9fad 80 VarCounter++;
julmbed 0:85afbf3c9fad 81 return 0;
julmbed 0:85afbf3c9fad 82 }
julmbed 0:85afbf3c9fad 83 }
julmbed 0:85afbf3c9fad 84 return ERR;
julmbed 0:85afbf3c9fad 85 }
julmbed 0:85afbf3c9fad 86
julmbed 0:85afbf3c9fad 87 /*******************************
julmbed 0:85afbf3c9fad 88 *
julmbed 0:85afbf3c9fad 89 *
julmbed 0:85afbf3c9fad 90 ********************************/
julmbed 0:85afbf3c9fad 91
julmbed 0:85afbf3c9fad 92 VarItem *VarStore::GetVar(char *Name)
julmbed 0:85afbf3c9fad 93 {
julmbed 0:85afbf3c9fad 94
julmbed 0:85afbf3c9fad 95 for (int i=0; i<SZ; i++)
julmbed 0:85afbf3c9fad 96 if((strcmp(Name,Store[i].GetVarName()))==0)
julmbed 0:85afbf3c9fad 97 return &Store[i];
julmbed 0:85afbf3c9fad 98
julmbed 0:85afbf3c9fad 99 return NULL;
julmbed 0:85afbf3c9fad 100 }
julmbed 0:85afbf3c9fad 101
julmbed 0:85afbf3c9fad 102 char* VarStore::Get(char *Name)
julmbed 0:85afbf3c9fad 103 {
julmbed 0:85afbf3c9fad 104
julmbed 0:85afbf3c9fad 105 VarItem *V;
julmbed 0:85afbf3c9fad 106
julmbed 0:85afbf3c9fad 107 V=GetVar(Name);
julmbed 0:85afbf3c9fad 108 if(V!=NULL) return V->Dump();
julmbed 0:85afbf3c9fad 109 else
julmbed 0:85afbf3c9fad 110 return NULL;
julmbed 0:85afbf3c9fad 111 }
julmbed 0:85afbf3c9fad 112
julmbed 0:85afbf3c9fad 113 /*******************************
julmbed 0:85afbf3c9fad 114 *
julmbed 0:85afbf3c9fad 115 *
julmbed 0:85afbf3c9fad 116 ********************************/
julmbed 0:85afbf3c9fad 117
julmbed 0:85afbf3c9fad 118 void VarStore::Worker(void const *args)
julmbed 0:85afbf3c9fad 119 {
julmbed 0:85afbf3c9fad 120 VarStore *MyThis=(VarStore *)args;
julmbed 3:cf43e6de918e 121 char c, *ret=STR_OK;// not NULL to start in no error state
julmbed 2:a59207652720 122
julmbed 2:a59207652720 123 int ci_counter=0;
julmbed 0:85afbf3c9fad 124 char Cs[CI_SZ];
julmbed 0:85afbf3c9fad 125
julmbed 2:a59207652720 126 // for(int i=0; i<CI_SZ; i++) Cs[i]='\0';
julmbed 2:a59207652720 127
julmbed 2:a59207652720 128 // MyThis->pc->printf(" hi worker\n");
julmbed 0:85afbf3c9fad 129 while (1) {
julmbed 0:85afbf3c9fad 130 if(MyThis->pc->readable()) {
julmbed 0:85afbf3c9fad 131 c=MyThis->pc->getc();
julmbed 0:85afbf3c9fad 132 // MyThis->pc->printf(" leo %c\n",c);
julmbed 0:85afbf3c9fad 133 if(ci_counter >= CI_SZ-1) { // RESET
julmbed 0:85afbf3c9fad 134 ci_counter=0;
julmbed 0:85afbf3c9fad 135 Cs[0]='\0';
julmbed 2:a59207652720 136 // MyThis->pc->printf(" reset\n");
julmbed 0:85afbf3c9fad 137
julmbed 0:85afbf3c9fad 138 } else {
julmbed 0:85afbf3c9fad 139 if(c=='\r') {
julmbed 0:85afbf3c9fad 140 Cs[ci_counter]='\0';
julmbed 4:4be2eaf872df 141 // MyThis->pc->printf(" CI -%s- \n",Cs);
julmbed 2:a59207652720 142 ret=MyThis->Do(Cs,MyThis);
julmbed 0:85afbf3c9fad 143 ci_counter=0;
julmbed 0:85afbf3c9fad 144 Cs[0]='\0';
julmbed 2:a59207652720 145 // MyThis->pc->printf(" set variable (%d)\n",ret);
julmbed 2:a59207652720 146 // MyThis->pc->printf(" Get offset -%s- \n",MyThis->Get("offset"));
julmbed 0:85afbf3c9fad 147 } else {
julmbed 4:4be2eaf872df 148 // MyThis->pc->printf(" CI -%s- -%c- -%d- \n",Cs,c,ci_counter);
julmbed 2:a59207652720 149
julmbed 0:85afbf3c9fad 150 Cs[ci_counter]=c;
julmbed 0:85afbf3c9fad 151 ci_counter++;
julmbed 4:4be2eaf872df 152 // MyThis->pc->printf(" parcial CI -%s- -%c-(%c) -%d- \n",Cs,c,Cs[ci_counter],ci_counter);
julmbed 0:85afbf3c9fad 153 }
julmbed 0:85afbf3c9fad 154 }
julmbed 0:85afbf3c9fad 155 }
julmbed 0:85afbf3c9fad 156
julmbed 2:a59207652720 157 if(ret==NULL) {
julmbed 0:85afbf3c9fad 158 Thread::wait(100);
julmbed 2:a59207652720 159 MyThis->pc->printf(" error setting/getting var \n");
julmbed 3:cf43e6de918e 160 ret=STR_OK;
julmbed 0:85afbf3c9fad 161 }
julmbed 4:4be2eaf872df 162 //Thread::wait(10);
julmbed 0:85afbf3c9fad 163 } // While
julmbed 0:85afbf3c9fad 164 }
julmbed 0:85afbf3c9fad 165
julmbed 0:85afbf3c9fad 166 /*******************************
julmbed 0:85afbf3c9fad 167 *
julmbed 0:85afbf3c9fad 168 *
julmbed 0:85afbf3c9fad 169 ********************************/
julmbed 0:85afbf3c9fad 170
julmbed 2:a59207652720 171 char *VarStore::Do(char *str, VarStore* MyThis)
julmbed 2:a59207652720 172 {
julmbed 2:a59207652720 173 char *ret;
julmbed 2:a59207652720 174 if(str != NULL) {
julmbed 2:a59207652720 175
julmbed 2:a59207652720 176 switch(*str) {
julmbed 2:a59207652720 177 case 's':
julmbed 2:a59207652720 178 return MyThis->Set(str);
julmbed 2:a59207652720 179 case 'd':
julmbed 2:a59207652720 180 strtok(str,":");
julmbed 2:a59207652720 181 ret=MyThis->Get(strtok(NULL,":"));
julmbed 2:a59207652720 182 if(ret!=NULL) {
julmbed 2:a59207652720 183 MyThis->pc->printf("%s (%s)\n",str,ret);
julmbed 2:a59207652720 184 return ret;
julmbed 2:a59207652720 185 } else
julmbed 2:a59207652720 186 return NULL;
julmbed 2:a59207652720 187 case 'r':
julmbed 2:a59207652720 188 mbed_reset();
julmbed 2:a59207652720 189 return NULL;
julmbed 3:cf43e6de918e 190 case 'w':
julmbed 3:cf43e6de918e 191 strtok(str,":");
julmbed 3:cf43e6de918e 192 Thread::wait(atoi(strtok(NULL,":")));
julmbed 3:cf43e6de918e 193 return STR_OK;
julmbed 2:a59207652720 194 };
julmbed 2:a59207652720 195 }
julmbed 2:a59207652720 196 return NULL;
julmbed 2:a59207652720 197 }
julmbed 2:a59207652720 198