teste de publish

Dependencies:   DS1820 HighSpeedAnalogIn devices mbed

antigaDevices.txt

Committer:
brunofgc
Date:
2018-06-08
Revision:
38:07d3907b74e5
Parent:
0:1c0a769988ee

File content as of revision 38:07d3907b74e5:

#include "devices.h"

//Devices
    device ** dispositivos;
    uint8_t devices=0;
    uint8_t alarmes=0;
//Devices

enum {
    estadoConfiguracao_idle = 0,
    estadoConfiguracao_creatingDevice,
    estadoConfiguracao_alarmSet,
    estadoConfiguracao_readingsSet
};

uint8_t resizeArray(uint32_t atual, uint32_t novo, char **array,uint16_t sizeUnit)
{
    uint32_t i;
    char *p = (char *) malloc(sizeUnit*novo);
    char *aux;

    if(p==NULL) {
        return 0;
    }

    aux = *array;

    if(atual) {
        //So sigo em frente se tinha algo dentro deste array
        for(i=0; i<(novo*sizeUnit); i++) {
            p[i]=aux[i];
        }
        free(aux);
    }

    *array = p;
    return 1;
}

enum {        
    modBusType_float=0,
    modBusType_bit,
    modBusType_uint8_t,
    modBusType_uint16_t,
    modBusType_uint32_t
};

void device::floatToBin(uint8_t dir, float *v,uint8_t *p)
{
    //Variáveis locais
    union {
        char c[4];
        float v;
    }u;
    int i;

    if(dir) {
        u.v = *v;
        for(i=0; i<4; i++) {
            p[i]=u.c[3-i];
        }
    } else {
        for(i=0; i<4; i++) {
            u.c[3-i]=p[i];
        }
        *v = u.v;
    }
}

void device::uint32_t_ToBin(uint8_t dir, uint32_t *v,uint8_t *p)
{
    //Variáveis locais
    union {
        char c[4];
        uint32_t v;
    }u;
    int i;

    if(dir) {
        u.v = *v;
        for(i=0; i<4; i++) {
            p[i]=u.c[3-i];
        }
    } else {
        for(i=0; i<4; i++) {
            u.c[3-i]=p[i];
        }
        *v = u.v;
    }
}

void device::uint16_t_ToBin(uint8_t dir, uint16_t *v,uint8_t *p)
{
    //Variáveis locais
    union {
        char c[2];
        uint32_t v;
    }u;
    int i;

    if(dir) {
        u.v = *v;
        for(i=0; i<2; i++) {
            p[i]=u.c[1-i];
        }
    } else {
        for(i=0; i<2; i++) {
            u.c[1-i]=p[i];
        }
        *v = u.v;
    }
}


void device::setReading(char *linha)
{
    uint8_t  addr=0;
    uint8_t  func=0;
    uint16_t  reg=0;
    uint8_t  numRegs=0;
    char *pChar;
    bool inputData = false;
    
    //printf("Linha <%s>.\n",linha);
    if(strstr(linha,"readingsSet")) {
        return;
    }

    //printf("O tamanho da struct eh <%lu>.\n",sizeof(reading));

    
    if(resizeArray(this->numReadings, this->numReadings+1, (char **)&this->readings,sizeof(reading))) {        
        //printf("Resize em readings beleza!\n");
        this->numReadings++;
    }
    
    if(strstr(linha,"float,")) {
        this->readings[this->numReadings-1].type=modBusType_float;                
        inputData = true;
    }

    if(strstr(linha,"uint32_t,")) {
        this->readings[this->numReadings-1].type=modBusType_uint32_t;
        inputData = true;
    }
    
    if(strstr(linha,"uint16_t,")) {
        this->readings[this->numReadings-1].type=modBusType_uint16_t;
        inputData = true;
    }
    
    if(strstr(linha,"uint8_t,")) {
        this->readings[this->numReadings-1].type=modBusType_uint8_t;
        inputData = true;
    }
    
    if(strstr(linha,"bool,")) {
        this->readings[this->numReadings-1].type=modBusType_bit;
        inputData = true;
    }
    
    if(inputData){
        pChar = strtok(linha,",");
        
        pChar = strtok(NULL,",");
        addr = atoi(pChar);        
        
        pChar = strtok(NULL,",");
        func = atoi(pChar);        
        
        pChar = strtok(NULL,",");
        reg = atoi(pChar);        
        
        pChar = strtok(NULL,",");
        numRegs = atoi(pChar);
        
        this->readings[this->numReadings-1].addr=addr;
        this->readings[this->numReadings-1].func=func;
        this->readings[this->numReadings-1].reg=reg;
        this->readings[this->numReadings-1].numRegs=numRegs;    
    }
    
}

void device::setAlarm(char *linha)
{    
    float floatVar;
    uint32_t aux32_t;
    uint16_t aux16_t;
    char *pChar;    

    if(strstr(linha,"alarmSet")) {
        if(resizeArray(this->numAlarms, this->numAlarms+1, (char **)&this->alarms,sizeof(alarm))) {            
            this->numAlarms++;
        }
    }

    if(strstr(linha,"name:")) {
        strtok(linha,":");
        strcpy(this->alarms[this->numAlarms-1].name,strtok(NULL,"\r\n"));
    }

    
    if(strstr(linha,"seconds:")) {
        //sscanf(linha,"seconds:%lu",&this->alarms[this->numAlarms-1].seconds);
        strtok(linha,":");
        pChar = strtok(NULL,"\r\n");
        this->alarms[this->numAlarms-1].seconds = atoi(pChar);
    }    
    
    
    if(strstr(linha,"bool:state")){        
        this->alarms[this->numAlarms-1].type=modBusType_bit;        
    
        pChar = strtok(linha,",");        
        
        pChar = strtok(NULL,",");
        this->alarms[this->numAlarms-1].addrModbusRead = atoi(pChar);    
        
        pChar = strtok(NULL,",");
        this->alarms[this->numAlarms-1].funcModbusRead = atoi(pChar);
        
        pChar = strtok(NULL,",");
        this->alarms[this->numAlarms-1].regModbusRead  = atoi(pChar);
        
        pChar = strtok(NULL,",");
        this->alarms[this->numAlarms-1].max[0]=atoi(pChar);
    }
    
    
    if(strstr(linha,"max:float")) {
        this->alarms[this->numAlarms-1].type=modBusType_float;
        //sscanf(linha,"max:float,%lu,%lu,%lu,%s",&aux1,&aux2,&aux3,stringVar);
        //this->alarms[this->numAlarms-1].addrModbusRead = aux1;    
        //this->alarms[this->numAlarms-1].funcModbusRead = aux2;
        //this->alarms[this->numAlarms-1].regModbusRead  = aux3;    
        
        
        strtok(linha,",");
        
        //Parametro 1;
        pChar = strtok(NULL,",");
        this->alarms[this->numAlarms-1].addrModbusRead = atoi(pChar);
        
        //Parametro 2;
        pChar = strtok(NULL,",");
        this->alarms[this->numAlarms-1].funcModbusRead = atoi(pChar);
        
        //Parametro 3;
        pChar = strtok(NULL,",");
        this->alarms[this->numAlarms-1].regModbusRead  = atoi(pChar);
        
        
        
        //Parametro 4;
        pChar = strtok(NULL,"\r\n");        
        floatVar = diversos::stringToFloat(pChar,100);        
    
        this->floatToBin(1,&floatVar,&this->alarms[this->numAlarms-1].max[0]);
    }    
    
    
    
    if(strstr(linha,"min:float")) {        
        this->alarms[this->numAlarms-1].type=modBusType_float;        
        strtok(linha,",");
        pChar = strtok(NULL,"\r\n");        
        floatVar = diversos::stringToFloat(pChar,100);
        this->floatToBin(1,&floatVar,&this->alarms[this->numAlarms-1].min[0]);
    }    
    
    if(strstr(linha,"max:uint32_t")) {
        this->alarms[this->numAlarms-1].type=modBusType_uint32_t;
        //sscanf(linha,"max:uint32_t,%lu,%lu,%lu,%lu",&aux1,&aux2,&aux3,&aux4);
        strtok(linha,",");
        
        //parametro1
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].addrModbusRead = atoi(pChar);
        
        //parametro2
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].funcModbusRead = atoi(pChar);
        
        //parametro3
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].regModbusRead  = atoi(pChar);
    
        //parametro4
        pChar = strtok(NULL,"\r\n");    
        aux32_t = atoi(pChar);
        
        this->uint32_t_ToBin(1,&aux32_t,&this->alarms[this->numAlarms-1].max[0]);
    }    
    
    if(strstr(linha,"min:uint32_t")) {        
        this->alarms[this->numAlarms-1].type=modBusType_uint32_t;
        //sscanf(linha,"min:uint32_t,%lu",&aux4);         
        strtok(linha,",");
        pChar = strtok(NULL,"\r\n");
        aux32_t = atoi(pChar);
        
        this->uint32_t_ToBin(1,&aux32_t,&this->alarms[this->numAlarms-1].min[0]);
    }    
    
    if(strstr(linha,"max:uint16_t")) {
        this->alarms[this->numAlarms-1].type=modBusType_uint16_t;
        strtok(linha,",");
        
        //parametro1
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].addrModbusRead = atoi(pChar);
        
        //parametro2
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].funcModbusRead = atoi(pChar);
        
        //parametro3
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].regModbusRead  = atoi(pChar);
    
        //parametro4
        pChar = strtok(NULL,"\r\n");    
        aux16_t = atoi(pChar);
        
        this->uint16_t_ToBin(1,&aux16_t,&this->alarms[this->numAlarms-1].max[0]);
    }    
    
    if(strstr(linha,"min:uint16_t")) {        
        this->alarms[this->numAlarms-1].type=modBusType_uint16_t;
        strtok(linha,",");
        pChar = strtok(NULL,"\r\n");
        aux16_t = atoi(pChar);
        
        this->uint16_t_ToBin(1,&aux16_t,&this->alarms[this->numAlarms-1].min[0]);
    }  
    
    if(strstr(linha,"max:uint8_t")) {
        this->alarms[this->numAlarms-1].type=modBusType_uint8_t;
        strtok(linha,",");
        
        //parametro1
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].addrModbusRead = atoi(pChar);
        
        //parametro2
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].funcModbusRead = atoi(pChar);
        
        //parametro3
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].regModbusRead  = atoi(pChar);
    
        //parametro4
        pChar = strtok(NULL,"\r\n");    
        aux16_t = atoi(pChar);  
    
        this->alarms[this->numAlarms-1].max[0]=aux16_t;
    }    
    
    if(strstr(linha,"min:uint8_t")) {        
        this->alarms[this->numAlarms-1].type=modBusType_uint8_t;
        strtok(linha,",");
        pChar = strtok(NULL,"\r\n");
        aux16_t = atoi(pChar);
        
        this->alarms[this->numAlarms-1].min[0]=aux16_t;
    }    
    
        
    
    if(strstr(linha,"act:modbus:")) {
        //sscanf(linha,"act:modbus:%u,%u,%u,%u",&aux1,&aux2,&aux3,&aux4);
        
        printf("Lido em act <%s>.\n",linha);
        strtok(linha,":");
        strtok(NULL,":");
        
        
        //parametro1
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].addrModbusWrite = atoi(pChar);
        
        //parametro2
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].funcModbusWrite = atoi(pChar);
        
        //parametro3
        pChar = strtok(NULL,",");    
        this->alarms[this->numAlarms-1].regModbusWrite  = atoi(pChar);
    
        //parametro4
        pChar = strtok(NULL,"\r\n");    
        aux16_t = atoi(pChar);  
    
        this->alarms[this->numAlarms-1].act=aux16_t;
    }        
    
}

void device::writeReadingsToSD(){    
    //Esta função faz a inserção de todos os dados no arquivo armazenamento.            
    
    /*float floatBuffer[2];
    modBusMaster1::readFloat(9,4,1,2,floatBuffer);   
    pc.printf("Lido na fuc problema <%f,%f>.",floatBuffer[0],floatBuffer[1]);*/
    
    uint16_t readingIndex=0;    
    float *floatBuffer;    
    
    sdCard::insereDadosArquivo(&sdCard::armazenamento,"data{",5);    
    for(readingIndex = 0;readingIndex < this->numReadings;readingIndex++){
        switch(this->readings[readingIndex].type){
            case modBusType_float:
                    //readFloat(uint8_t,uint8_t,uint16_t,uint16_t,float*); //Endereço slave, funcCode, registrador, quantidade de registros,ponteiro para registros float
                    floatBuffer = (float*) malloc(this->readings[readingIndex].numRegs*sizeof(float));
                    modBusMaster1::readFloat(
                        this->readings[readingIndex].addr,
                        this->readings[readingIndex].func,
                        this->readings[readingIndex].reg,
                        this->readings[readingIndex].numRegs,
                        floatBuffer
                    );
                    sdCard::insereDadosArquivo(&sdCard::armazenamento,(char *)floatBuffer,4*this->readings[readingIndex].numRegs);
                    free(floatBuffer);
                break;
        }
    }
    sdCard::insereDadosArquivo(&sdCard::armazenamento,"}dataEnd;",9);
}


/*void device::verifyAlarms(){
    
}*/

device::device()
{
    this->numAlarms=0;
    this->numReadings=0;
}

void testa_writeReadingsToSD(){
    int i;
    for(i=0;i<devices;i++){
        dispositivos[i]->writeReadingsToSD();    
    }
}

int criaDevices(FILE *devicesCfg)
{
    char linha[40];
    int i;
    int linhas = 0;
    devices = 0;

    while(fgets(linha,maxCaractereLeLinha,devicesCfg)) {
        if(strstr(linha,"deviceCreate\\")) {
            devices++;
        }
        linhas++;
    }

    printf("Contei %u linha(s), %u device(s).\n",linhas,devices);

    //Criando vetor de objetos dispositivos;
    
    dispositivos = (device **) malloc(sizeof(device)*devices);

    for(i=0; i<devices; i++) {
        dispositivos[i] = new device();
        dispositivos[i]->id=i;
    }

    rewind(devicesCfg);
    return 1;
}





int configuraDevices(FILE *devicesCfg)
{
    uint16_t linhas=0;
    //uint16_t leituras = 0;
    char linha[40];
    uint8_t estadoConfiguracao=estadoConfiguracao_idle;
    int8_t dispositivoEmConfiguracao = -1;

    while(fgets(linha,maxCaractereLeLinha,devicesCfg)) {
        if(strstr(linha,"deviceCreate\\")) {
            dispositivoEmConfiguracao++;
            //printf("Configurando dispositivo de indice %u.\n",dispositivoEmConfiguracao);
            estadoConfiguracao = estadoConfiguracao_creatingDevice;
        }

        if(strstr(linha,"alarmSet")) {
            //printf("Criando alarme no dispositivo de indice %u.\n",dispositivoEmConfiguracao);
            alarmes++;
            estadoConfiguracao = estadoConfiguracao_alarmSet;
        }

        if(strstr(linha,"readingsSet")) {
            //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);
            estadoConfiguracao = estadoConfiguracao_readingsSet;
        }

        if(strstr(linha,"readingsEnd")) {
            //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);
            estadoConfiguracao = estadoConfiguracao_idle;
        }

        if(strstr(linha,">")) {
            //printf("Fechando dispositivo de indice %u.\n",dispositivoEmConfiguracao);
            estadoConfiguracao = estadoConfiguracao_idle;
        }

        switch(estadoConfiguracao) {
            case estadoConfiguracao_creatingDevice:
                if(strstr(linha,"id:")) {
                    sscanf(linha,"id:%u",&dispositivos[dispositivoEmConfiguracao]->id);                    
                }
                break;
            case estadoConfiguracao_alarmSet:
                //Inclue linha nos alarmes do dispositivo em configuração
                dispositivos[dispositivoEmConfiguracao]->setAlarm(linha);
                break;
            case estadoConfiguracao_readingsSet:
                //Inclue linha nas leituras do dispositivo em configuração
                dispositivos[dispositivoEmConfiguracao]->setReading(linha);
                break;
        }

        linhas++;
    }
    printf("Contei %u linha(s), configurei %u dispositivo(s), instalei %u alarme(s) nos dispositivo(s).\n",linhas,devices,alarmes);    
    return 1;
}



void testaTudoDevices()
{
    int i;
    int j;

    for(i=0; i<devices; i++) {
        printf("Dispositivo %u tem id %u, %u alarmes sendo eles:\n",i,dispositivos[i]->id,dispositivos[i]->numAlarms);

        for(j=0; j<dispositivos[i]->numAlarms; j++) {
            printf("Alarme %u:\n",j);
            printf("\tName <%s>.\n",dispositivos[i]->alarms[j].name);
            printf("\tSeconds <%lu>.\n",dispositivos[i]->alarms[j].seconds);
            printf("\tAddr %u, func %u, reg %lu.\n",dispositivos[i]->alarms[j].addrModbusRead,dispositivos[i]->alarms[j].funcModbusRead,dispositivos[i]->alarms[j].regModbusRead);
            if(dispositivos[i]->alarms[j].type==modBusType_float) {
                float max,min;
                dispositivos[i]->floatToBin(0,&max,&dispositivos[i]->alarms[j].max[0]);
                dispositivos[i]->floatToBin(0,&min,&dispositivos[i]->alarms[j].min[0]);
                printf("\tFloat Max <%f>.\n",max);
                printf("\tFloat Min <%f>.\n",min);
            }
            
            if(dispositivos[i]->alarms[j].type==modBusType_uint32_t) {
                uint32_t max,min;
                dispositivos[i]->uint32_t_ToBin(0,&max,&dispositivos[i]->alarms[j].max[0]);
                dispositivos[i]->uint32_t_ToBin(0,&min,&dispositivos[i]->alarms[j].min[0]);
                printf("\tuint32_t Max <%lu>.\n",max);
                printf("\tuint32_t Min <%lu>.\n",min);
            }
            
            if(dispositivos[i]->alarms[j].type==modBusType_uint16_t) {
                uint16_t max,min;
                dispositivos[i]->uint16_t_ToBin(0,&max,&dispositivos[i]->alarms[j].max[0]);
                dispositivos[i]->uint16_t_ToBin(0,&min,&dispositivos[i]->alarms[j].min[0]);
                printf("\tuint16_t Max <%lu>.\n",max);
                printf("\tuint16_t Min <%lu>.\n",min);
            }
            
            if(dispositivos[i]->alarms[j].type==modBusType_uint8_t) {
                uint8_t max,min;
                max=dispositivos[i]->alarms[j].max[0];
                min=dispositivos[i]->alarms[j].min[0];
                printf("\tuint8_t Max <%u>.\n",max);
                printf("\tuint8_t Min <%u>.\n",min);
            }
            
            if(dispositivos[i]->alarms[j].type==modBusType_bit) {
                uint8_t max;
                max=dispositivos[i]->alarms[j].max[0];                
                printf("\tbool state <%u>.\n",max);                
            }

            printf("\tAct %u, Addr %u, func %u, reg %lu.\n",dispositivos[i]->alarms[j].act,dispositivos[i]->alarms[j].addrModbusWrite,dispositivos[i]->alarms[j].funcModbusWrite,dispositivos[i]->alarms[j].regModbusWrite);
        }

        printf("Dispositivo %u tem id %u, %u leituras sendo elas:\n",i,dispositivos[i]->id,dispositivos[i]->numReadings);

        for(j=0; j<dispositivos[i]->numReadings; j++) {
            printf("Leitura %u:",j);
            switch(dispositivos[i]->readings[j].type) {
                case modBusType_float:
                        printf("Tipo float ");
                    break;
                case modBusType_uint32_t:
                        printf("Tipo uint32_t ");
                    break;                
                    
                case modBusType_uint16_t:
                        printf("Tipo uint16_t ");
                    break;                
                    
                case modBusType_uint8_t:
                        printf("Tipo uint8_t ");
                    break;                
                    
                case modBusType_bit:
                        printf("Tipo bool ");
                    break;                                    
                    
            }

            printf("addr %u, func %u, reg %u, numRegs %u.\n",dispositivos[i]->readings[j].addr,dispositivos[i]->readings[j].func,dispositivos[i]->readings[j].reg,dispositivos[i]->readings[j].numRegs);
        }
    }
}