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.
VarStore.cpp@4:4be2eaf872df, 2014-08-25 (annotated)
- 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?
User | Revision | Line number | New 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 |