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@12:e9c8d2d9ac71, 2014-08-26 (annotated)
- 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?
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 | 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 |