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:
3:cf43e6de918e
Parent:
2:a59207652720
Child:
4:4be2eaf872df

File content as of revision 3:cf43e6de918e:


#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(Serial *ser)
{
    VarCounter=0;
    this->pc=ser;
// doesn't work....  Thread thread(VarStore::Worker,this,osPriorityNormal,DEFAULT_STACK_SIZE,NULL);

}

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

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

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

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

    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)
{

    VarItem *V;

    V=GetVar(Name);
    if(V!=NULL) return V->Dump();
    else
        return NULL;
}

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

void VarStore::Worker(void const *args)
{
    VarStore *MyThis=(VarStore *)args;
    char c, *ret=STR_OK;// not NULL to start in no error state
    
    int ci_counter=0;
    char Cs[CI_SZ];

//    for(int i=0; i<CI_SZ; i++) Cs[i]='\0';

//   MyThis->pc->printf(" hi worker\n");
    while (1) {
        if(MyThis->pc->readable()) {
            c=MyThis->pc->getc();
//           MyThis->pc->printf(" leo %c\n",c);
            if(ci_counter >= CI_SZ-1) {   // RESET
                ci_counter=0;
                Cs[0]='\0';
//               MyThis->pc->printf(" reset\n");

            } else {
                if(c=='\r') {
                    Cs[ci_counter]='\0';
                    MyThis->pc->printf(" CI -%s- \n",Cs);
                    ret=MyThis->Do(Cs,MyThis);
                    ci_counter=0;
                    Cs[0]='\0';
                    //                 MyThis->pc->printf(" set variable (%d)\n",ret);
                    //                  MyThis->pc->printf(" Get offset -%s- \n",MyThis->Get("offset"));
                } else {
//                   MyThis->pc->printf(" CI -%s- -%c- -%d- \n",Cs,c,ci_counter);

                    Cs[ci_counter]=c;
                    ci_counter++;
                    //                  MyThis->pc->printf(" parcial CI -%s- -%c-(%c) -%d- \n",Cs,c,Cs[ci_counter],ci_counter);
                }
            }
        }

        if(ret==NULL) {
            Thread::wait(100);
            MyThis->pc->printf(" error setting/getting var \n");
            ret=STR_OK;
        }
        Thread::wait(100);
    } // While
}

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

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

        switch(*str) {
            case 's':
                return MyThis->Set(str);
            case 'd':
                strtok(str,":");
                ret=MyThis->Get(strtok(NULL,":"));
                if(ret!=NULL) {
                    MyThis->pc->printf("%s (%s)\n",str,ret);
                    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;
}