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 20:44:39 2014 +0000
Revision:
9:d081aa4e4418
Parent:
8:934ec53fe2c0
Child:
10:34d368966675
workin with rawserial and without malloc.  dump string limited to 132 chars

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 8:934ec53fe2c0 18 VarStore::VarStore( RawSerial *ser)
julmbed 0:85afbf3c9fad 19 {
julmbed 0:85afbf3c9fad 20 VarCounter=0;
julmbed 8:934ec53fe2c0 21 this->pc=ser;
julmbed 0:85afbf3c9fad 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 VarStore::~VarStore()
julmbed 0:85afbf3c9fad 30 {
julmbed 0:85afbf3c9fad 31 //dtor
julmbed 0:85afbf3c9fad 32 }
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 2:a59207652720 39 char *VarStore::Set(char *Input)
julmbed 0:85afbf3c9fad 40 {
julmbed 0:85afbf3c9fad 41 VarItem *V;
julmbed 0:85afbf3c9fad 42 char *Name;
julmbed 0:85afbf3c9fad 43
julmbed 8:934ec53fe2c0 44 // beaware of puts pc->printf("VarStore Set %s\n",Input);
julmbed 8:934ec53fe2c0 45
julmbed 0:85afbf3c9fad 46 if(Input [0] == 's') {
julmbed 0:85afbf3c9fad 47 strtok(Input,":");
julmbed 0:85afbf3c9fad 48 Name=strtok(NULL,":");
julmbed 0:85afbf3c9fad 49 if((V=GetVar(Name)) != NULL)
julmbed 2:a59207652720 50 return V->SetVal(strtok(NULL,":"))!= ERR ? Input : NULL;
julmbed 0:85afbf3c9fad 51 }
julmbed 2:a59207652720 52 return NULL;
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
julmbed 0:85afbf3c9fad 61 int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType )
julmbed 0:85afbf3c9fad 62 {
julmbed 0:85afbf3c9fad 63 return Load(Name, VarPtr,VarType,0 );
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
julmbed 0:85afbf3c9fad 71 int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType, int Size )
julmbed 0:85afbf3c9fad 72 {
julmbed 0:85afbf3c9fad 73
julmbed 0:85afbf3c9fad 74 if(GetVar(Name) ==NULL) {
julmbed 0:85afbf3c9fad 75 if(VarCounter < SZ) {
julmbed 0:85afbf3c9fad 76 Store[VarCounter].SetVar(VarType,VarPtr);
julmbed 0:85afbf3c9fad 77 Store[VarCounter].SetVarName(Name);
julmbed 0:85afbf3c9fad 78 Store[VarCounter].SetVarArraySize(Size);
julmbed 0:85afbf3c9fad 79 VarCounter++;
julmbed 0:85afbf3c9fad 80 return 0;
julmbed 0:85afbf3c9fad 81 }
julmbed 0:85afbf3c9fad 82 }
julmbed 0:85afbf3c9fad 83 return ERR;
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
julmbed 0:85afbf3c9fad 91 VarItem *VarStore::GetVar(char *Name)
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 VarItem *V;
julmbed 8:934ec53fe2c0 103 V=GetVar(Name);
julmbed 9:d081aa4e4418 104 if(V!=NULL)
julmbed 9:d081aa4e4418 105 return V->Dump();
julmbed 9:d081aa4e4418 106 else
julmbed 0:85afbf3c9fad 107 return NULL;
julmbed 0:85afbf3c9fad 108 }
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 7:fafe81a95c08 115 void Worker2();
julmbed 7:fafe81a95c08 116
julmbed 7:fafe81a95c08 117 void Worker2()
julmbed 0:85afbf3c9fad 118 {
julmbed 8:934ec53fe2c0 119
julmbed 6:9848fdaf2ad9 120 static char c, *ret=STR_OK;// not NULL to start in no error state
julmbed 8:934ec53fe2c0 121
julmbed 6:9848fdaf2ad9 122 static int ci_counter=0;
julmbed 6:9848fdaf2ad9 123 static char Cs[CI_SZ];
julmbed 8:934ec53fe2c0 124 if(VarStore::MyThis->pc->readable()) {
julmbed 8:934ec53fe2c0 125 c=VarStore::MyThis->pc->getc();
julmbed 2:a59207652720 126
julmbed 8:934ec53fe2c0 127 if(ci_counter >= CI_SZ-1) { // RESET
julmbed 8:934ec53fe2c0 128 ci_counter=0;
julmbed 8:934ec53fe2c0 129 Cs[0]='\0';
julmbed 8:934ec53fe2c0 130 } else {
julmbed 8:934ec53fe2c0 131 if(c=='\r') {
julmbed 8:934ec53fe2c0 132 Cs[ci_counter]='\0';
julmbed 8:934ec53fe2c0 133 ret=VarStore::MyThis->Do(Cs);
julmbed 0:85afbf3c9fad 134 ci_counter=0;
julmbed 0:85afbf3c9fad 135 Cs[0]='\0';
julmbed 0:85afbf3c9fad 136 } else {
julmbed 8:934ec53fe2c0 137 Cs[ci_counter]=c;
julmbed 8:934ec53fe2c0 138 ci_counter++;
julmbed 0:85afbf3c9fad 139 }
julmbed 0:85afbf3c9fad 140 }
julmbed 8:934ec53fe2c0 141 }
julmbed 0:85afbf3c9fad 142
julmbed 8:934ec53fe2c0 143 if(ret==NULL) {
julmbed 8:934ec53fe2c0 144 VarStore::MyThis->pc->puts(" error setting/getting var \n");
julmbed 8:934ec53fe2c0 145 ret=STR_OK;
julmbed 8:934ec53fe2c0 146 }
julmbed 8:934ec53fe2c0 147
julmbed 0:85afbf3c9fad 148 }
julmbed 0:85afbf3c9fad 149
julmbed 0:85afbf3c9fad 150 /*******************************
julmbed 0:85afbf3c9fad 151 *
julmbed 0:85afbf3c9fad 152 *
julmbed 0:85afbf3c9fad 153 ********************************/
julmbed 6:9848fdaf2ad9 154
julmbed 8:934ec53fe2c0 155 VarStore *VarStore::MyThis=NULL; // used by the worker reading the terminal. Need to be initilized this way to avoid
julmbed 8:934ec53fe2c0 156 // compiling errors
julmbed 5:47b67a7c0bb7 157 void VarStore::Worker(void const *args)
julmbed 5:47b67a7c0bb7 158 {
julmbed 5:47b67a7c0bb7 159
julmbed 5:47b67a7c0bb7 160 VarStore::MyThis=(VarStore *)args;
julmbed 5:47b67a7c0bb7 161
julmbed 8:934ec53fe2c0 162 // cuidado puts VarStore::MyThis->pc->(" hi worker 1\n");
julmbed 8:934ec53fe2c0 163
julmbed 7:fafe81a95c08 164 VarStore::MyThis->pc->attach(&Worker2);
julmbed 5:47b67a7c0bb7 165
julmbed 5:47b67a7c0bb7 166 while(1) {
julmbed 6:9848fdaf2ad9 167 Thread::wait(1000);
julmbed 5:47b67a7c0bb7 168 }
julmbed 5:47b67a7c0bb7 169
julmbed 5:47b67a7c0bb7 170 }
julmbed 5:47b67a7c0bb7 171 /*******************************
julmbed 5:47b67a7c0bb7 172 *
julmbed 5:47b67a7c0bb7 173 *
julmbed 5:47b67a7c0bb7 174 ********************************/
julmbed 0:85afbf3c9fad 175
julmbed 7:fafe81a95c08 176 char *VarStore::Do(char *str)
julmbed 2:a59207652720 177 {
julmbed 2:a59207652720 178 char *ret;
julmbed 2:a59207652720 179 if(str != NULL) {
julmbed 2:a59207652720 180
julmbed 2:a59207652720 181 switch(*str) {
julmbed 2:a59207652720 182 case 's':
julmbed 6:9848fdaf2ad9 183 return VarStore::MyThis->Set(str);
julmbed 2:a59207652720 184 case 'd':
julmbed 8:934ec53fe2c0 185
julmbed 9:d081aa4e4418 186 VarStore::MyThis->pc->puts(str);
julmbed 9:d081aa4e4418 187 VarStore::MyThis->pc->putc('\n');
julmbed 9:d081aa4e4418 188
julmbed 8:934ec53fe2c0 189 ret=strtok(str,":");
julmbed 8:934ec53fe2c0 190 ret=strtok(NULL,":");
julmbed 8:934ec53fe2c0 191
julmbed 8:934ec53fe2c0 192 ret=VarStore::MyThis->Get(ret);
julmbed 8:934ec53fe2c0 193
julmbed 2:a59207652720 194 if(ret!=NULL) {
julmbed 9:d081aa4e4418 195 VarStore::MyThis->pc->puts(ret);
julmbed 9:d081aa4e4418 196 VarStore::MyThis->pc->putc('\n');
julmbed 2:a59207652720 197 return ret;
julmbed 2:a59207652720 198 } else
julmbed 2:a59207652720 199 return NULL;
julmbed 2:a59207652720 200 case 'r':
julmbed 2:a59207652720 201 mbed_reset();
julmbed 2:a59207652720 202 return NULL;
julmbed 3:cf43e6de918e 203 case 'w':
julmbed 3:cf43e6de918e 204 strtok(str,":");
julmbed 3:cf43e6de918e 205 Thread::wait(atoi(strtok(NULL,":")));
julmbed 3:cf43e6de918e 206 return STR_OK;
julmbed 2:a59207652720 207 };
julmbed 2:a59207652720 208 }
julmbed 2:a59207652720 209 return NULL;
julmbed 2:a59207652720 210 }
julmbed 2:a59207652720 211