For Terrance

Dependencies:   mbed

Code/Configuration.c

Committer:
emh203
Date:
2012-06-13
Revision:
0:085749c8446f

File content as of revision 0:085749c8446f:

#include "System.h"

LocalFileSystem LocalFS("local"); 

CHAR LineBuf[128];

//Voltage Divider for the Li_poly Battery
float R17,R15;
#define R17_DEFAULT  (float)(10000.0)
#define R15_DEFAULT  (float)(10000.0)

//Voltage Divider for input voltage measurement
float R2,R4;
#define R2_DEFAULT  (float)(100000.0)
#define R4_DEFAULT  (float)(3300.0)

//Voltage Divider for current voltage measurement (to the 16-bit ADC)
float R6,R7;
#define R6_DEFAULT (float) (10000.0)
#define R7_DEFAULT  (float)(10000.0)

//Voltage Divider for current voltage measurement (to the 12-bit ADC)
float R8,R9;
#define R8_DEFAULT  (float)(5100.0)
#define R9_DEFAULT  (float)(10000.0)

//value of the 2.5Voltage reference
float U1_VREF;
#define U1_VREF_DEFAULT    (float)(2.5)

//value of the MBED Voltage reference
float MBED_VREF;
#define MBED_VREF_DEFAULT    (float)(3.3)

//value of the input diode drop
float INPUT_DIODE_DROP;
#define INPUT_DIODE_DROP_DEFAULT   (float)(0.601)


//used for self current 
float R22;
#define R22_DEFAULT 0.5

float R18;
#define R18_DEFAULT 200

float R19;
#define R19_DEFAULT 200

float R20;
#define R20_DEFAULT 10000


//Parameters for the ACS576 Current Sensor

float ACS576_VOFFSET;
#define ACS576_VOFFSET_DEFAULT              (2.5)

float ACS576_ISCALE; 
#define ACS576_ISCALE_DEFAULT              (25.0)

float ACS576_ISCALE_ADJUST; 
#define ACS576_ISCALE_ADJUST_DEFAULT         (1.0)

float ACS576_IOFFSET_TRIM; 
#define ACS576_IOFFSET_TRIM_DEFAULT        (0.0)

//Used to correct the input voltage measurement
float  VSCALE_ADJUST; 
#define VSCALE_ADJUST_DEFAULT        (1.0)

float  VOFFSET_ADJUST; 
#define VOFFSET_ADJUST_DEFAULT        (0.0)

//Sampling Parameters
float   SAMPLE_RATE;
DWORD   WRITE_BLOCK_THRESH;

CHAR ID[MAX_ID_LENGTH+1];
#define ID_DEFAULT "No ID"

void LoadDefaults()
{
    strcpy(ID,ID_DEFAULT);

    VOFFSET_ADJUST = VOFFSET_ADJUST_DEFAULT;
    VSCALE_ADJUST  = VSCALE_ADJUST_DEFAULT;
    
    R17 = R17_DEFAULT;
    R15 = R15_DEFAULT;

    R2 = R2_DEFAULT;
    R4 = R4_DEFAULT;

    R6 = R6_DEFAULT;
    R7 = R7_DEFAULT;
    
    R8 = R8_DEFAULT;
    R9 = R9_DEFAULT;
    
    R18 = R18_DEFAULT;
    R19 = R19_DEFAULT;
    R20 = R20_DEFAULT;
    R22 = R22_DEFAULT;
    
    U1_VREF = U1_VREF_DEFAULT;
    MBED_VREF = MBED_VREF_DEFAULT;
    
    INPUT_DIODE_DROP =  INPUT_DIODE_DROP_DEFAULT;
    
    ACS576_VOFFSET = ACS576_VOFFSET_DEFAULT;

    ACS576_ISCALE =  ACS576_ISCALE_DEFAULT;
    ACS576_ISCALE_ADJUST = ACS576_ISCALE_ADJUST_DEFAULT;
    
    ACS576_IOFFSET_TRIM = ACS576_IOFFSET_TRIM_DEFAULT;
    
    SAMPLE_RATE = SAMPLE_RATE_DEFAULT;
    WRITE_BLOCK_THRESH = WRITE_BLOCK_THRESH_DEFAULT;
}

void ExportConfigurationSettings()
{
    FILE *MyConfigFile = fopen("/local/config.txt","w");
    
    
    fprintf(MyConfigFile,"ACS576_ISCALE_ADJUST = %.3f  \r\n",ACS576_ISCALE_ADJUST); 
    fprintf(MyConfigFile,"ACS576_IOFFSET_TRIM = %.3f  \r\n",ACS576_IOFFSET_TRIM);
    
    fprintf(MyConfigFile,"VSCALE_ADJUST = %.3f  \r\n",VSCALE_ADJUST);
    fprintf(MyConfigFile,"VOFFSET_ADJUST = %.3f  \r\n",VOFFSET_ADJUST);
    
    fprintf(MyConfigFile,"R17 = %.1f  \r\n",R17);
    fprintf(MyConfigFile,"R15 = %.1f  \r\n",R15);

    fprintf(MyConfigFile,"R2 = %.1f  \r\n",R2);
    fprintf(MyConfigFile,"R4 = %.1f  \r\n", R4);

    fprintf(MyConfigFile,"R6 = %.1f  \r\n",R6);
    fprintf(MyConfigFile,"R7 = %.1f  \r\n",R7);
    
    fprintf(MyConfigFile,"R8 = %.1f  \r\n",R8);
    fprintf(MyConfigFile,"R9 = %.1f  \r\n",R9);
    
    fprintf(MyConfigFile,"R18 = %.1f  \r\n",R18);
    fprintf(MyConfigFile,"R19 = %.1f  \r\n",R19);
    fprintf(MyConfigFile,"R20 = %.1f  \r\n",R20);
    fprintf(MyConfigFile,"R22 = %.1f  \r\n",R22);
    
    fprintf(MyConfigFile,"U1_VREF = %.3f  \r\n",U1_VREF);
    fprintf(MyConfigFile,"MBED_VREF = %.3f  \r\n",MBED_VREF);
    
    fprintf(MyConfigFile,"INPUT_DIODE_DROP = %.3f  \r\n",INPUT_DIODE_DROP);
    
    fprintf(MyConfigFile,"ACS576_VOFFSET = %.3f  \r\n",ACS576_VOFFSET);

    fprintf(MyConfigFile,"ACS576_ISCALE = %.3f  \r\n", ACS576_ISCALE_DEFAULT);
   
    
    fprintf(MyConfigFile,"SAMPLE_RATE = %.1f  \r\n",SAMPLE_RATE);
    fprintf(MyConfigFile,"WRITE_BLOCK_THRESH = %d  \r\n",WRITE_BLOCK_THRESH);
  
    fprintf(MyConfigFile,"ID = %s    \r\n",ID);
  
  
    fclose(MyConfigFile);
}

//This is a very "static implementation.  Just does string compares.  Would be nice to have a table like feature in the future
void  ParseKeyValue(const CHAR *Key,const CHAR *Value)
{
    WORD i;
    
     if(!strcmp(Key,(CHAR *)"R17"))
    {
        R17 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R17 assigned a value of %.3f",R17);
    }
    else if(!strcmp(Key,"R15"))
    {
        R15 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R15 assigned a value of %.3f",R15);
    }
    else if(!strcmp(Key,"R2"))
    {
        R2 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R2 assigned a value of %.3f",R2);
    }
    else if(!strcmp(Key,"R4"))
    {
        R4 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R4 assigned a value of %.3f",R4);
    }
    else if(!strcmp(Key,"R6"))
    {
        R6 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R6 assigned a value of %.3f",R6);
    }
    else if(!strcmp(Key,"R7"))
    {
        R7 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R7 assigned a value of %.3f",R7);
    }
    else if(!strcmp(Key,"R8"))
    {
        R8 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R8 assigned a value of %.3f",R8);
    }
    else if(!strcmp(Key,"R9"))
    {
        R9 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R9 assigned a value of %.3f",R9);
    }
    else if(!strcmp(Key,"U1_VREF"))
    {
        U1_VREF = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"U1_VREF assigned a value of %.3f",U1_VREF);
    }
    else if(!strcmp(Key,"MBED_VREF"))
    {
        MBED_VREF = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"MBED_VREF assigned a value of %.3f",MBED_VREF);
    }
    else if(!strcmp(Key,"INPUT_DIODE_DROP"))
    {
        INPUT_DIODE_DROP = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"INPUT_DIODE_DROP assigned a value of %.3f",INPUT_DIODE_DROP);
    }
    else if(!strcmp(Key,"ACS576_VOFFSET"))
    {
        ACS576_VOFFSET = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"ACS576_VOFFSET assigned a value of %.3f", ACS576_VOFFSET);
    }
    else if(!strcmp(Key,"ACS576_ISCALE"))
    {
        ACS576_ISCALE = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"ACS576_ISCALE assigned a value of %.3f", ACS576_ISCALE);
    }
     else if(!strcmp(Key,"ACS576_ISCALE_ADJUST"))
    {
        ACS576_ISCALE_ADJUST = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"ACS576_ISCALE_ADJUST assigned a value of %.3f", ACS576_ISCALE_ADJUST);
    }
    else if(!strcmp(Key,"ACS576_IOFFSET_TRIM"))
    {
        ACS576_IOFFSET_TRIM = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"ACS576_IOFFSET_TRIM assigned a value of %.3f",  ACS576_IOFFSET_TRIM);
    }
    else if(!strcmp(Key,"R18"))
    {
        R18 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R18 assigned a value of %.3f",  R18);
    }
    else if(!strcmp(Key,"R19"))
    {
        R19 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R19 assigned a value of %.3f",  R19);
    }
    else if(!strcmp(Key,"R20"))
    {
        R20 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R20 assigned a value of %.3f",  R20);
    }
    else if(!strcmp(Key,"R22"))
    {
        R22 = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"R22 assigned a value of %.3f",  R22);
    }
    else if(!strcmp(Key,"VSCALE_ADJUST"))
    {
        VSCALE_ADJUST = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"VSCALE_ADJUST assigned a value of %.3f",  VSCALE_ADJUST);
    }
    else if(!strcmp(Key,"VOFFSET_ADJUST"))
    {
        VOFFSET_ADJUST = atof(Value);
        PrintfEnqueue(&PCBackDoorTx,"VOFFSET_ADJUST assigned a value of %.3f",  VOFFSET_ADJUST);
    }
    else if(!strcmp(Key,"SAMPLE_RATE"))
    {
        SAMPLE_RATE = atof(Value);
         
           if(SAMPLE_RATE < MIN_SAMPLE_RATE || SAMPLE_RATE > MAX_SAMPLE_RATE)
           {
               PrintfEnqueue(&PCBackDoorTx,"Illegal SAMPLE_RATE of %.1f was specified. %.1f is being used",SAMPLE_RATE,SAMPLE_RATE_DEFAULT);
                SAMPLE_RATE = SAMPLE_RATE_DEFAULT;
            }
            else
            {
                    PrintfEnqueue(&PCBackDoorTx,"SAMPLE_RATE assigned a value of %.1f",  SAMPLE_RATE);
            }
    }
    
    else if(!strcmp(Key,"WRITE_BLOCK_THRESH"))
    {
         WRITE_BLOCK_THRESH = (DWORD)atof(Value);
         
           if(WRITE_BLOCK_THRESH < MIN_WRITE_BLOCK_THRESH|| WRITE_BLOCK_THRESH > MAX_WRITE_BLOCK_THRESH)
           {
                PrintfEnqueue(&PCBackDoorTx,"Illegal WRITE_BLOCK_THRESH of %d was specified. %d is being used\r\n",WRITE_BLOCK_THRESH,WRITE_BLOCK_THRESH_DEFAULT);
                PrintfEnqueue(&PCBackDoorTx,"WRITE_BLOCK_THRESH must be between %d and %d",MIN_WRITE_BLOCK_THRESH, MAX_WRITE_BLOCK_THRESH); 
             
                WRITE_BLOCK_THRESH = WRITE_BLOCK_THRESH_DEFAULT;
            }
            else
            {
                    PrintfEnqueue(&PCBackDoorTx,"WRITE_BLOCK_THRESH assigned a value of %d",  WRITE_BLOCK_THRESH);
            }
    }
    else if(!strcmp(Key,"ID"))
    {
        if(strlen(Value)>MAX_ID_LENGTH)
        {
             PrintfEnqueue(&PCBackDoorTx,"ID must be %d characters or less.  Truncating...",  MAX_ID_LENGTH); 
             for(i=0;i<MAX_ID_LENGTH;i++)
             {
                ID[i] = Value[i];
                ID[MAX_ID_LENGTH] = NULL;
             }         
        } 
        else
        {
          strcpy(ID,Value);
        }     
      
        PrintfEnqueue(&PCBackDoorTx,"ID assigned a value of %s",  ID);  
    }
    else
    {
        PrintfEnqueue(&PCBackDoorTx,"%s key is not recognized parameter",Key);
    }
   
    PrintfEnqueue(&PCBackDoorTx,"\r\n");

}

void LoadConfiguration()
{
    WORD CurrentLine = 1;
    
    LoadDefaults();

    SmartSwitch_SetBackLightColor(3,3,3);
    GFX_FullDisplayBufferClear(&BackBuffer);
    GFX_DrawString(&BackBuffer,"Loading Config",0,0,&Font3x5);
    GFX_DumpRenderContextToPhysicalScreen(&BackBuffer);
    
    FILE *MyConfigFile = fopen("/local/config.txt","r");
    
    if(!MyConfigFile)
    {
        PrintfEnqueue(&PCBackDoorTx,"Could not open configuration files. Using Defaults....\r\n");
        wait(1);
        return;
    }
    
    PrintfEnqueue(&PCBackDoorTx,"Config file found.  Parsing.....\r\n\r\n");
  
    while(fgets(LineBuf,sizeof(LineBuf),MyConfigFile))
    {
       if(KeyValueSplit(LineBuf,Key,Value))
       {
             ParseKeyValue(Key,Value);
       }
       else
       {
           PrintfEnqueue(&PCBackDoorTx,"No valid key=value pair on line %d\r\n",CurrentLine);
       }
       
       CurrentLine++;
    }
    
    fclose(MyConfigFile);
    
    PrintfEnqueue(&PCBackDoorTx,"\r\n\r\n>");
}