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

Committer:
julmbed
Date:
2014-08-25
Revision:
8:934ec53fe2c0
Parent:
7:fafe81a95c08
Child:
9:d081aa4e4418

File content as of revision 8:934ec53fe2c0:


#include <string.h>
#include  <stdio.h>
#include "mbed.h"
#include "rtos.h"


extern "C" void mbed_reset();

#include "VarStore.h"

#define CI_SZ 100

/*******************************
*
*
********************************/
VarStore::VarStore(     RawSerial *ser)
{
    VarCounter=0;
    this->pc=ser;
}

/*******************************
*
*
********************************/

VarStore::~VarStore()
{
    //dtor
}

/*******************************
*
*
********************************/

char *VarStore::Set(char *Input)
{
    VarItem *V;
    char *Name;

   // beaware of puts  pc->printf("VarStore Set %s\n",Input);

    if(Input [0] == 's') {
        strtok(Input,":");
        Name=strtok(NULL,":");
        if((V=GetVar(Name)) != NULL)
            return  V->SetVal(strtok(NULL,":"))!= ERR ? Input : NULL;
    }
    return NULL;
}

/*******************************
*
*
********************************/


int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType )
{
    return Load(Name, VarPtr,VarType,0 );
}

/*******************************
*
*
********************************/

int VarStore::Load(char *Name, void *VarPtr,VarTypes VarType, int Size )
{

    if(GetVar(Name) ==NULL) {
        if(VarCounter < SZ) {
            Store[VarCounter].SetVar(VarType,VarPtr);
            Store[VarCounter].SetVarName(Name);
            Store[VarCounter].SetVarArraySize(Size);
            VarCounter++;
            return 0;
        }
    }
    return ERR;
}

/*******************************
*
*
********************************/

VarItem *VarStore::GetVar(char *Name)
{
    for (int i=0; i<SZ; i++)
        if((strcmp(Name,Store[i].GetVarName()))==0)
            return &Store[i];

    return NULL;
}

char*  VarStore::Get(char *Name)
{
    char b[100];
    VarItem *V;
    V=GetVar(Name);
    VarStore::MyThis->pc->puts(" antes de dump ");
    sprintf(b," %s %d %d %d \n",
        V->VarName,*V->ValInt,V->VarType,V->ArraySize);
       
    VarStore::MyThis->pc->puts(b);
     V->Dump();
    
  //  char VarName[VAR_NAME_LEN];

  //  int   *ValInt;
  //  float *ValFloat;
  //  VarTypes VarType;
  //  unsigned int ArraySize;
 //   if(V!=NULL) return V->Dump();
 //   else
     VarStore::MyThis->pc->puts(" despues de dump ");
        return NULL;
}

/*******************************
*
*
********************************/

void Worker2();

void Worker2()
{

    static char c, *ret=STR_OK;// not NULL to start in no error state

    static int ci_counter=0;
    static char Cs[CI_SZ];
    if(VarStore::MyThis->pc->readable()) {
        c=VarStore::MyThis->pc->getc();

        if(ci_counter >= CI_SZ-1) {   // RESET
            ci_counter=0;
            Cs[0]='\0';
        } else {
            if(c=='\r') {
                Cs[ci_counter]='\0';
                ret=VarStore::MyThis->Do(Cs);
                ci_counter=0;
                Cs[0]='\0';
            } else {
                Cs[ci_counter]=c;
                ci_counter++;
            }
        }
    }

    if(ret==NULL) {
        VarStore::MyThis->pc->puts(" error setting/getting var \n");
        ret=STR_OK;
    }

}

/*******************************
*
*
********************************/

VarStore *VarStore::MyThis=NULL;   // used by the worker reading the terminal. Need to be initilized this way to avoid
// compiling errors
void VarStore::Worker(void const *args)
{

    VarStore::MyThis=(VarStore *)args;

//  cuidado puts VarStore::MyThis->pc->(" hi worker 1\n");

    VarStore::MyThis->pc->attach(&Worker2);

    while(1) {
        Thread::wait(1000);
    }

}
/*******************************
*
*
********************************/

char  *VarStore::Do(char *str)
{
    char *ret;
    if(str != NULL) {

        switch(*str) {
            case 's':
                return VarStore::MyThis->Set(str);
            case 'd':

                ret=strtok(str,":");
                ret=strtok(NULL,":");
                
                ret=VarStore::MyThis->Get(ret);
             
                if(ret!=NULL) {
                  //  cuidado puts VarStore::MyThis->pc->printf("%s (%s)\n",str,ret);
                  VarStore::MyThis->pc->puts("el del mostrar variable");
                    return ret;
                } else
                    return NULL;
            case 'r':
                mbed_reset();
                return NULL;
            case 'w':
                strtok(str,":");
                Thread::wait(atoi(strtok(NULL,":")));
                return STR_OK;
        };
    }
    return NULL;
}