http://http://diytec.web.fc2.com/mark2r2/

Dependencies:   EthernetNetIf NTPClient_NetServices mbed ConfigFile

config_env.c

Committer:
mark2r2
Date:
2011-09-20
Revision:
0:08a4d61cd84c

File content as of revision 0:08a4d61cd84c:

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

 config_env.c  

*************************************************************/
#include "mbed.h"
#include "TextLCD.h"
#define CHUNK   1
#define AVERAGE_MIN 10*60/CHUNK
#define TMP_TEXT_BUF_SIZE (256)

static char envini[] = "/local/env.ini";
#define default_fwserver  "http://diytec.web.fc2.com/mark2r2/firmware"
//char default_fwserver[] = "http://diytec.web.fc2.com/mark2r2/firmware";

extern int mode,gps_mode;
extern int shape_mode;
extern int AnalogInput_pin_number;
extern int GMInterrupt_pin_number;
extern int LED_pin_number;
extern int Buzzer_pin_number;
extern int GPStx_pin_number;
extern int GPSrx_pin_number;
extern float carib;
extern int updateinterval;
extern int updatetype;  /* 0: no 1: twitter 2: pachube */
extern int sound;    /* 0: off  1: on */
extern float volt; /* voltage executed to GM tube */
extern float offset_usv;
extern TextLCD lcd;
extern int firmware_update_interval;
extern time_t tz_offset;
extern Serial pc;
extern int init_stabilize_time;
extern int cpu_speed;

extern float carib_cpm0;
extern float carib_usv0;
extern float carib_cpm1;
extern float carib_usv1;
extern unsigned int cpm_array_max;
extern unsigned int long_cpm_array_max;

void trim(char *retbuff, char *inbuff) {
    int i,j,len;
    
    len=strlen(inbuff);
    for(i=0,j=0;i<len; i++){
        if(inbuff[i]>0x20) {
            retbuff[j]=inbuff[i];
            j++;
        }
    }
    retbuff[j]='\0';


}


int GetStatus(char *path, char *tag, char *text){
    char TmpText[TMP_TEXT_BUF_SIZE];
    char TmpTag[TMP_TEXT_BUF_SIZE];
    FILE *stm = fopen(path, "r");
    
    if(stm != NULL){
        text[0] = '\0';
        sprintf(TmpTag, "%s:%%s",tag);
        
        while(fgets(TmpText, TMP_TEXT_BUF_SIZE, stm) != NULL){
            if(sscanf(TmpText, TmpTag, text)==EOF){
                printf("error reading %s",tag);
            }
        }
        fclose(stm);
    }    
    else {
        printf("file open error: %s\r\n",path);
        lcd.cls();
        lcd.printf("open err: %s",path);
        abort();
    }    

    return(0);
}

/*-----------
//  
    // See http://mbed.org/users/no2chem/notebook/mbed-clock-control--benchmarks/

// NOTE:if the clock speed is down, the power consumption becomes low but the timer becomes slow.

void cpu_setting() {                                //  2011/08/19
    char msgs[80];

    if(GetStatus(envfile,"cpu_speed",msgs)==0){      
        int m = atoi(msgs);
        if(m >= 6 && m <= 12){
            cpu_speed=atof(msgs);
        }
     }
}
--------------*/

#define IntVal       1   //int (positive only)
#define IntVal_t1    2   //int (-1 is permitted)
#define TimeVal      3   //time_t
#define UintVal      4   //unsigned int
#define FloatVal     5   //float
#define FloatVal_t1  6   //float (negative permitted)
#define FloatVal_t2  7   //float (negative & 0 permitted)

static char gmfile[20];

// For env.ini
struct envGet {
    char*   str;
    int     envtype;
    void*   datval;
    char*   file_id;
} EnvGetTable[] = {
    {"mode", IntVal_t1, &mode, envini},
    {"shape", IntVal, &shape_mode, envini},
    {"gps", IntVal, &gps_mode, envini},
    {"updateinterval",IntVal,&updateinterval, envini},
    {"updatetype", IntVal, &updatetype, envini},
    {"sound", IntVal, &sound, envini},
    {"firmware_update_interval",IntVal,&firmware_update_interval, envini},
    {"timezone",TimeVal, &tz_offset, envini},
    {"init_stabilize_time", IntVal, &init_stabilize_time, envini},
    {"GMInterrupt", IntVal, &GMInterrupt_pin_number, envini},
    {"LED", IntVal, &LED_pin_number, envini},
    {"Buzzer", IntVal, &Buzzer_pin_number, envini},
    {"GPStx", IntVal, &GPStx_pin_number, envini},
    {"GPSrx", IntVal, &GPSrx_pin_number, envini},
    {"cpm_array_max", UintVal, &cpm_array_max, envini},
    {"long_cpm_array_max", UintVal, &long_cpm_array_max, envini},
    {"cariburation",FloatVal, &carib, gmfile},
    {"voltage",FloatVal, &volt, gmfile},
    {"offset_usv", FloatVal_t1, &offset_usv, gmfile},
    {"cpm0", FloatVal, &carib_cpm0, gmfile},
    {"usv0", FloatVal, &carib_usv0, gmfile},
    {"cpm1", FloatVal, &carib_cpm1, gmfile},
    {"usv1", FloatVal, &carib_usv1, gmfile},  
    {"uSv0", FloatVal_t2, &carib_usv0, gmfile},
    {"uSv1", FloatVal_t2, &carib_usv1, gmfile}
};

void environment_setting(char *fws){
    char msgs[80];
    char gmtype[50];

    // GM tube characteristic feature reading //    
    if(GetStatus(envini,"gmtype",gmtype)==0){
        strcpy(gmfile,"/local/");
        strcat(gmfile,gmtype);
        printf("%s will be used for GM tube cariburation\n",gmfile);
    
        for(int i=0; i<sizeof(EnvGetTable)/sizeof(envGet) ; i++ ) {
            if(GetStatus(EnvGetTable[i].file_id,EnvGetTable[i].str,msgs)==0){
                switch(EnvGetTable[i].envtype) {
                    case IntVal:
                        if(atoi(msgs)>0){
                            *((int*)EnvGetTable[i].datval)=atoi(msgs);
                        }
                        printf("%s=%d\r\n", EnvGetTable[i].str, *((int*)EnvGetTable[i].datval));
                    break;
                    case IntVal_t1:
                        if(atoi(msgs)>0 || atoi(msgs)==-1){
                            *((int*)EnvGetTable[i].datval)=atoi(msgs);
                        }
                        printf("%s=%d\r\n", EnvGetTable[i].str, *((int*)EnvGetTable[i].datval));
                    break;
                    case TimeVal:
                        if(msgs[0] != '\0'){
                            *((time_t*)EnvGetTable[i].datval)=atoi(msgs);
                        }
                        printf("%s=%d\r\n", EnvGetTable[i].str, *((time_t*)EnvGetTable[i].datval));
                    break;
                    case UintVal:
                        if(atoi(msgs)>0){
                            *((unsigned int*)EnvGetTable[i].datval)=atoi(msgs);
                        }
                        printf("%s=%d\r\n", EnvGetTable[i].str, *((unsigned int*)EnvGetTable[i].datval));
                    break;
                    case FloatVal:
                        if(atof(msgs)>= 0){
                            *((float*)EnvGetTable[i].datval)=atof(msgs);
                        }
                        printf("%s=%f\r\n", EnvGetTable[i].str, *((float*)EnvGetTable[i].datval));
                    break;
                     case FloatVal_t1:
                        *((float*)EnvGetTable[i].datval)=atof(msgs);
                        printf("%s=%f\r\n", EnvGetTable[i].str, *((float*)EnvGetTable[i].datval));
                    break;              
                     case FloatVal_t2:
                        if(atof(msgs)> 0){
                            *((float*)EnvGetTable[i].datval)=atof(msgs);
                            printf("%s=%f\r\n", EnvGetTable[i].str, *((float*)EnvGetTable[i].datval));
                        }                                                                                   
                    break;              
                    
                }
            }
        }
        
        if(GetStatus(envini,"fwserver",msgs)==0){
            if(strlen(msgs) <= 3){
                strcpy(fws, default_fwserver);
            } else {
                trim(fws,msgs);
            }
        }
        printf("fwserver=%s\r\n", fws);
    
        updateinterval*=(60/CHUNK);
        tz_offset *= 3600;
    
        // override by 2 point cariburation
        if (carib_cpm0 > 0 && carib_usv0 > 0 && 
            carib_cpm1 > 0 && carib_usv1 > 0 &&
            (carib_cpm0 < carib_cpm1 && carib_usv0 < carib_usv1) ||
            (carib_cpm0 > carib_cpm1 && carib_usv0 > carib_usv1)) {
            carib = (carib_cpm1 - carib_cpm0) / (carib_usv1 - carib_usv0);
            offset_usv = carib_usv0 - (carib_cpm0 / carib);
            printf("2 point cariburation=%f\r\n", carib);
            printf("2 point offset_usv=%f\r\n", offset_usv);
        }
    
        if( (updatetype == 0) && (cpm_array_max <10)) {
        } else {
            cpm_array_max = 10;
        }
        cpm_array_max *= 60/CHUNK;
    }
}