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 10:45:03 2014 +0000
Revision:
2:a59207652720
Parent:
1:bbd6b84fc908
Child:
3:cf43e6de918e
worker como  static, lanzandolo de manera independiente en el main. admite tres comandos, via ->DO que son set/get-dump/reset para carge de nuevo programa en el mbed sin darle al boton

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 0:85afbf3c9fad 45 if(Input [0] == 's') {
julmbed 0:85afbf3c9fad 46 strtok(Input,":");
julmbed 0:85afbf3c9fad 47 Name=strtok(NULL,":");
julmbed 0:85afbf3c9fad 48 if((V=GetVar(Name)) != NULL)
julmbed 2:a59207652720 49 return V->SetVal(strtok(NULL,":"))!= ERR ? Input : NULL;
julmbed 0:85afbf3c9fad 50 }
julmbed 2:a59207652720 51 return NULL;
julmbed 0:85afbf3c9fad 52 }
julmbed 0:85afbf3c9fad 53
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 int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType )
julmbed 0:85afbf3c9fad 61 {
julmbed 0:85afbf3c9fad 62 return Load(Name, VarPtr,VarType,0 );
julmbed 0:85afbf3c9fad 63 }
julmbed 0:85afbf3c9fad 64
julmbed 0:85afbf3c9fad 65 /*******************************
julmbed 0:85afbf3c9fad 66 *
julmbed 0:85afbf3c9fad 67 *
julmbed 0:85afbf3c9fad 68 ********************************/
julmbed 0:85afbf3c9fad 69
julmbed 0:85afbf3c9fad 70 int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType, int Size )
julmbed 0:85afbf3c9fad 71 {
julmbed 0:85afbf3c9fad 72
julmbed 0:85afbf3c9fad 73 if(GetVar(Name) ==NULL) {
julmbed 0:85afbf3c9fad 74 if(VarCounter < SZ) {
julmbed 0:85afbf3c9fad 75 Store[VarCounter].SetVar(VarType,VarPtr);
julmbed 0:85afbf3c9fad 76 Store[VarCounter].SetVarName(Name);
julmbed 0:85afbf3c9fad 77 Store[VarCounter].SetVarArraySize(Size);
julmbed 0:85afbf3c9fad 78 VarCounter++;
julmbed 0:85afbf3c9fad 79 return 0;
julmbed 0:85afbf3c9fad 80 }
julmbed 0:85afbf3c9fad 81 }
julmbed 0:85afbf3c9fad 82 return ERR;
julmbed 0:85afbf3c9fad 83 }
julmbed 0:85afbf3c9fad 84
julmbed 0:85afbf3c9fad 85 /*******************************
julmbed 0:85afbf3c9fad 86 *
julmbed 0:85afbf3c9fad 87 *
julmbed 0:85afbf3c9fad 88 ********************************/
julmbed 0:85afbf3c9fad 89
julmbed 0:85afbf3c9fad 90 VarItem *VarStore::GetVar(char *Name)
julmbed 0:85afbf3c9fad 91 {
julmbed 0:85afbf3c9fad 92
julmbed 0:85afbf3c9fad 93 for (int i=0; i<SZ; i++)
julmbed 0:85afbf3c9fad 94 if((strcmp(Name,Store[i].GetVarName()))==0)
julmbed 0:85afbf3c9fad 95 return &Store[i];
julmbed 0:85afbf3c9fad 96
julmbed 0:85afbf3c9fad 97 return NULL;
julmbed 0:85afbf3c9fad 98 }
julmbed 0:85afbf3c9fad 99
julmbed 0:85afbf3c9fad 100 char* VarStore::Get(char *Name)
julmbed 0:85afbf3c9fad 101 {
julmbed 0:85afbf3c9fad 102
julmbed 0:85afbf3c9fad 103 VarItem *V;
julmbed 0:85afbf3c9fad 104
julmbed 0:85afbf3c9fad 105 V=GetVar(Name);
julmbed 0:85afbf3c9fad 106 if(V!=NULL) return V->Dump();
julmbed 0:85afbf3c9fad 107 else
julmbed 0:85afbf3c9fad 108 return NULL;
julmbed 0:85afbf3c9fad 109 }
julmbed 0:85afbf3c9fad 110
julmbed 0:85afbf3c9fad 111 /*******************************
julmbed 0:85afbf3c9fad 112 *
julmbed 0:85afbf3c9fad 113 *
julmbed 0:85afbf3c9fad 114 ********************************/
julmbed 0:85afbf3c9fad 115
julmbed 0:85afbf3c9fad 116 void VarStore::Worker(void const *args)
julmbed 0:85afbf3c9fad 117 {
julmbed 0:85afbf3c9fad 118 VarStore *MyThis=(VarStore *)args;
julmbed 2:a59207652720 119 char c, *ret="";// not NULL to start in no error state
julmbed 2:a59207652720 120
julmbed 2:a59207652720 121 int ci_counter=0;
julmbed 0:85afbf3c9fad 122 char Cs[CI_SZ];
julmbed 0:85afbf3c9fad 123
julmbed 2:a59207652720 124 // for(int i=0; i<CI_SZ; i++) Cs[i]='\0';
julmbed 2:a59207652720 125
julmbed 2:a59207652720 126 // MyThis->pc->printf(" hi worker\n");
julmbed 0:85afbf3c9fad 127 while (1) {
julmbed 0:85afbf3c9fad 128 if(MyThis->pc->readable()) {
julmbed 0:85afbf3c9fad 129 c=MyThis->pc->getc();
julmbed 0:85afbf3c9fad 130 // MyThis->pc->printf(" leo %c\n",c);
julmbed 0:85afbf3c9fad 131 if(ci_counter >= CI_SZ-1) { // RESET
julmbed 0:85afbf3c9fad 132 ci_counter=0;
julmbed 0:85afbf3c9fad 133 Cs[0]='\0';
julmbed 2:a59207652720 134 // MyThis->pc->printf(" reset\n");
julmbed 0:85afbf3c9fad 135
julmbed 0:85afbf3c9fad 136 } else {
julmbed 0:85afbf3c9fad 137 if(c=='\r') {
julmbed 0:85afbf3c9fad 138 Cs[ci_counter]='\0';
julmbed 0:85afbf3c9fad 139 MyThis->pc->printf(" CI -%s- \n",Cs);
julmbed 2:a59207652720 140 ret=MyThis->Do(Cs,MyThis);
julmbed 0:85afbf3c9fad 141 ci_counter=0;
julmbed 0:85afbf3c9fad 142 Cs[0]='\0';
julmbed 2:a59207652720 143 // MyThis->pc->printf(" set variable (%d)\n",ret);
julmbed 2:a59207652720 144 // MyThis->pc->printf(" Get offset -%s- \n",MyThis->Get("offset"));
julmbed 0:85afbf3c9fad 145 } else {
julmbed 2:a59207652720 146 // MyThis->pc->printf(" CI -%s- -%c- -%d- \n",Cs,c,ci_counter);
julmbed 2:a59207652720 147
julmbed 0:85afbf3c9fad 148 Cs[ci_counter]=c;
julmbed 0:85afbf3c9fad 149 ci_counter++;
julmbed 2:a59207652720 150 // MyThis->pc->printf(" parcial CI -%s- -%c-(%c) -%d- \n",Cs,c,Cs[ci_counter],ci_counter);
julmbed 0:85afbf3c9fad 151 }
julmbed 0:85afbf3c9fad 152 }
julmbed 0:85afbf3c9fad 153 }
julmbed 0:85afbf3c9fad 154
julmbed 2:a59207652720 155 if(ret==NULL) {
julmbed 0:85afbf3c9fad 156 Thread::wait(100);
julmbed 2:a59207652720 157 MyThis->pc->printf(" error setting/getting var \n");
julmbed 2:a59207652720 158 ret="";
julmbed 0:85afbf3c9fad 159 }
julmbed 0:85afbf3c9fad 160 Thread::wait(100);
julmbed 0:85afbf3c9fad 161 } // While
julmbed 0:85afbf3c9fad 162 }
julmbed 0:85afbf3c9fad 163
julmbed 0:85afbf3c9fad 164 /*******************************
julmbed 0:85afbf3c9fad 165 *
julmbed 0:85afbf3c9fad 166 *
julmbed 0:85afbf3c9fad 167 ********************************/
julmbed 0:85afbf3c9fad 168
julmbed 2:a59207652720 169 char *VarStore::Do(char *str, VarStore* MyThis)
julmbed 2:a59207652720 170 {
julmbed 2:a59207652720 171 char *ret;
julmbed 2:a59207652720 172 if(str != NULL) {
julmbed 2:a59207652720 173
julmbed 2:a59207652720 174 switch(*str) {
julmbed 2:a59207652720 175 case 's':
julmbed 2:a59207652720 176 return MyThis->Set(str);
julmbed 2:a59207652720 177 case 'd':
julmbed 2:a59207652720 178 strtok(str,":");
julmbed 2:a59207652720 179 ret=MyThis->Get(strtok(NULL,":"));
julmbed 2:a59207652720 180 if(ret!=NULL) {
julmbed 2:a59207652720 181 MyThis->pc->printf("%s (%s)\n",str,ret);
julmbed 2:a59207652720 182 return ret;
julmbed 2:a59207652720 183 } else
julmbed 2:a59207652720 184 return NULL;
julmbed 2:a59207652720 185 case 'r':
julmbed 2:a59207652720 186 mbed_reset();
julmbed 2:a59207652720 187 return NULL;
julmbed 2:a59207652720 188 };
julmbed 2:a59207652720 189 }
julmbed 2:a59207652720 190 return NULL;
julmbed 2:a59207652720 191 }
julmbed 2:a59207652720 192