teste de publish

Revision:
0:8c59a494a451
Child:
1:3f9e5b86d9e4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devices.cpp	Fri Mar 24 15:54:14 2017 +0000
@@ -0,0 +1,1485 @@
+#include "devices.h"
+
+enum {
+    estadoConfiguracao_idle = 0,
+    estadoConfiguracao_creatingDevice,
+    estadoConfiguracao_alarmSet,
+    estadoConfiguracao_readingsSet,
+    estadoConfiguracao_scheduleSet
+};
+
+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;
+}
+
+void writeReadingsToSD(){
+    int i;
+    for(i=0;i<devices;i++){
+        dispositivos[i]->writeReadingsToSD();
+    }
+}
+
+void verifyAlarms(){
+    int i;
+    for(i=0;i<devices;i++){
+        dispositivos[i]->verifyAlarms();
+    }
+}
+
+void verifySchedules(){
+    int i;
+    for(i=0;i<devices;i++){
+        dispositivos[i]->verifySchedules();
+    }
+}
+
+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::verifyAlarms(){
+    //Inicio da verificação
+    uint16_t alarmIndex;
+    float leitura_float,value_float;
+    uint32_t leitura_uint32_t,value_uint32_t;
+    uint16_t leitura_uint16_t,value_uint16_t;
+    bool leitura_bit,value_bit;    
+    bool alarmFound;
+    char aux[30];
+    
+    for(alarmIndex = 0;alarmIndex < this->numAlarms;alarmIndex++){
+        alarmFound=this->alarms[alarmIndex].alarmFound;
+        switch(this->alarms[alarmIndex].type){
+            case modBusType_float:                                        
+                    //Montar float!
+                    this->floatToBin(0,&value_float,&this->alarms[alarmIndex].value[0]);                    
+                    
+                    if(this->alarms[alarmIndex].addrModbusRead != 254){
+                        //Bloco de leitura da variável modBus;
+                        modBusMaster1::readFloat(
+                            this->alarms[alarmIndex].addrModbusRead,
+                            this->alarms[alarmIndex].funcModbusRead,
+                            this->alarms[alarmIndex].regModbusRead,
+                            1,
+                            &leitura_float
+                        );
+                    }else{
+                        leitura_float = aiFiltrada[this->alarms[alarmIndex].regModbusRead];   
+                     }
+            
+                    if(this->alarms[alarmIndex].max!=0){
+                        if(leitura_float > value_float){
+                            this->alarms[alarmIndex].secAlarm++;
+                            if(this->alarms[alarmIndex].secAlarm >= this->alarms[alarmIndex].seconds){
+                                this->alarms[alarmIndex].secAlarm = this->alarms[alarmIndex].seconds;
+                                alarmFound = true;
+                            }
+                        }else{
+                            if(this->alarms[alarmIndex].secAlarm==1){
+                                this->alarms[alarmIndex].secAlarm=0;
+                                alarmFound = false;    
+                            }else{
+                                if(this->alarms[alarmIndex].secAlarm){
+                                    if(alarmFound){
+                                     this->alarms[alarmIndex].secAlarm--;   
+                                    }else{
+                                        this->alarms[alarmIndex].secAlarm=0;
+                                     }
+                                }
+                             }
+                         }
+                    }else{
+                        if(leitura_float < value_float){
+                            this->alarms[alarmIndex].secAlarm++;
+                            if(this->alarms[alarmIndex].secAlarm >= this->alarms[alarmIndex].seconds){
+                                this->alarms[alarmIndex].secAlarm = this->alarms[alarmIndex].seconds;
+                                alarmFound = true;
+                            }
+                        }else{
+                            if(this->alarms[alarmIndex].secAlarm==1){
+                                this->alarms[alarmIndex].secAlarm=0;
+                                alarmFound = false;    
+                            }else{
+                                if(this->alarms[alarmIndex].secAlarm){
+                                    if(alarmFound){
+                                     this->alarms[alarmIndex].secAlarm--;   
+                                    }else{
+                                        this->alarms[alarmIndex].secAlarm=0;
+                                     }    
+                                }
+                             }
+                         }
+                     }                                                                             
+                break;
+            case modBusType_uint32_t:
+                    //Montar uint32_t!
+                    this->uint32_t_ToBin(0,&value_uint32_t,&this->alarms[alarmIndex].value[0]);                    
+                    
+                    //Bloco de leitura da variável modBus;
+                    modBusMaster1::readRegister32BIT(
+                        this->alarms[alarmIndex].addrModbusRead,
+                        this->alarms[alarmIndex].funcModbusRead,
+                        this->alarms[alarmIndex].regModbusRead,
+                        1,
+                        &leitura_uint32_t
+                    );                                       
+            
+                    if(this->alarms[alarmIndex].max!=0){
+                        if(leitura_uint32_t > value_uint32_t){
+                            this->alarms[alarmIndex].secAlarm++;
+                            if(this->alarms[alarmIndex].secAlarm >= this->alarms[alarmIndex].seconds){
+                                this->alarms[alarmIndex].secAlarm = this->alarms[alarmIndex].seconds;
+                                alarmFound = true;
+                            }
+                        }else{
+                            if(this->alarms[alarmIndex].secAlarm==1){
+                                this->alarms[alarmIndex].secAlarm=0;
+                                alarmFound = false;    
+                            }else{
+                                if(this->alarms[alarmIndex].secAlarm){
+                                    if(alarmFound){
+                                     this->alarms[alarmIndex].secAlarm--;   
+                                    }else{
+                                        this->alarms[alarmIndex].secAlarm=0;
+                                     }
+                                }
+                             }
+                         }
+                    }else{
+                        if(leitura_uint32_t < value_uint32_t){
+                            this->alarms[alarmIndex].secAlarm++;
+                            if(this->alarms[alarmIndex].secAlarm >= this->alarms[alarmIndex].seconds){
+                                this->alarms[alarmIndex].secAlarm = this->alarms[alarmIndex].seconds;
+                                alarmFound = true;
+                            }
+                        }else{
+                            if(this->alarms[alarmIndex].secAlarm==1){
+                                this->alarms[alarmIndex].secAlarm=0;
+                                alarmFound = false;    
+                            }else{
+                                if(this->alarms[alarmIndex].secAlarm){
+                                    if(alarmFound){
+                                     this->alarms[alarmIndex].secAlarm--;   
+                                    }else{
+                                        this->alarms[alarmIndex].secAlarm=0;
+                                     }    
+                                }
+                             }
+                         }
+                     }                    
+                break;
+                
+            case modBusType_uint16_t:
+                    //Montar uint16_t!
+                    this->uint16_t_ToBin(0,&value_uint16_t,&this->alarms[alarmIndex].value[0]);                    
+                    
+                    if(this->alarms[alarmIndex].addrModbusRead!=255){
+                        //Bloco de leitura da variável modBus;
+                        modBusMaster1::readRegister16BIT(
+                            this->alarms[alarmIndex].addrModbusRead,
+                            this->alarms[alarmIndex].funcModbusRead,
+                            this->alarms[alarmIndex].regModbusRead,
+                            1,
+                            &leitura_uint16_t
+                        );     
+                    }else{
+                        if((this->alarms[alarmIndex].regModbusRead > 0) &&(this->alarms[alarmIndex].regModbusRead<4)){
+                            leitura_uint16_t = aiFiltrada[this->alarms[alarmIndex].regModbusRead-1];
+                        }
+                     }
+            
+                    if(this->alarms[alarmIndex].max!=0){
+                        if(leitura_uint16_t > value_uint16_t){
+                            this->alarms[alarmIndex].secAlarm++;
+                            if(this->alarms[alarmIndex].secAlarm >= this->alarms[alarmIndex].seconds){
+                                this->alarms[alarmIndex].secAlarm = this->alarms[alarmIndex].seconds;
+                                alarmFound = true;
+                            }
+                        }else{
+                            if(this->alarms[alarmIndex].secAlarm==1){
+                                this->alarms[alarmIndex].secAlarm=0;
+                                alarmFound = false;    
+                            }else{
+                                if(this->alarms[alarmIndex].secAlarm){
+                                    if(alarmFound){
+                                     this->alarms[alarmIndex].secAlarm--;   
+                                    }else{
+                                        this->alarms[alarmIndex].secAlarm=0;
+                                     }
+                                }
+                             }
+                         }
+                    }else{
+                        if(leitura_uint16_t < value_uint16_t){
+                            this->alarms[alarmIndex].secAlarm++;
+                            if(this->alarms[alarmIndex].secAlarm >= this->alarms[alarmIndex].seconds){
+                                this->alarms[alarmIndex].secAlarm = this->alarms[alarmIndex].seconds;
+                                alarmFound = true;
+                            }
+                        }else{
+                            if(this->alarms[alarmIndex].secAlarm==1){
+                                this->alarms[alarmIndex].secAlarm=0;
+                                alarmFound = false;    
+                            }else{
+                                if(this->alarms[alarmIndex].secAlarm){
+                                    if(alarmFound){
+                                     this->alarms[alarmIndex].secAlarm--;   
+                                    }else{
+                                        this->alarms[alarmIndex].secAlarm=0;
+                                     }    
+                                }
+                             }
+                         }
+                     } 
+                break;
+            
+            case modBusType_bit:
+                    //Montar bit!
+                    //O valor de alarm para bit é o value[0]!!!
+                    value_bit = (this->alarms[alarmIndex].value[0] > 0); //Qualquer valor maior que zero da saída 1
+                    
+                    if(this->alarms[alarmIndex].addrModbusRead != 254){
+                        //Bloco de leitura da variável modBus;
+                        modBusMaster1::readCoils(
+                            this->alarms[alarmIndex].addrModbusRead,                        
+                            this->alarms[alarmIndex].regModbusRead,
+                            1,
+                            &leitura_bit
+                        );
+                    }else{
+                        leitura_bit = entradasDigitais[this->alarms[alarmIndex].regModbusRead];   
+                     }
+
+                    if(leitura_bit == value_bit){
+                        this->alarms[alarmIndex].secAlarm++;
+                        if(this->alarms[alarmIndex].secAlarm >= this->alarms[alarmIndex].seconds){
+                            this->alarms[alarmIndex].secAlarm = this->alarms[alarmIndex].seconds;
+                            alarmFound = true;
+                        }
+                    }else{
+                        if(this->alarms[alarmIndex].secAlarm==1){
+                            this->alarms[alarmIndex].secAlarm=0;
+                            alarmFound = false;    
+                        }else{
+                            if(this->alarms[alarmIndex].secAlarm){
+                                if(alarmFound){
+                                 this->alarms[alarmIndex].secAlarm--;   
+                                }else{
+                                    this->alarms[alarmIndex].secAlarm=0;
+                                 }
+                            }
+                         }
+                     }                    
+                break;
+            
+        }
+        
+        //Verifico se houve alarme não tratado
+        if(this->alarms[alarmIndex].alarmFound!=alarmFound){
+           this->alarms[alarmIndex].alarmFound=alarmFound;
+           if(alarmFound){
+               printf("Alarm FOUND! Id <%lu>.\n",this->alarms[alarmIndex].id);               
+               sdCardBuf.fill("log{alarm:event:found;id:",25);
+               sprintf(aux,"%lu",this->alarms[alarmIndex].id);
+               sdCardBuf.fill(aux,strlen(aux));               
+               
+               sdCardBuf.fill(";timestamp:",11);
+               sprintf(aux,"%lu",time(NULL));
+               sdCardBuf.fill(aux,strlen(aux));               
+               
+               sdCardBuf.fill(";reading:",9);
+               if(this->alarms[alarmIndex].type == modBusType_float){
+                   sprintf(aux,"%f",leitura_float);
+               }else if(this->alarms[alarmIndex].type == modBusType_uint32_t){
+                   sprintf(aux,"%lu",leitura_uint32_t);
+               }else if(this->alarms[alarmIndex].type == modBusType_uint16_t){
+                   sprintf(aux,"%lu",leitura_uint16_t);
+               }else if(this->alarms[alarmIndex].type == modBusType_bit){
+                   sprintf(aux,"%lu",leitura_bit);
+               }
+               sdCardBuf.fill(aux,strlen(aux));                            
+               leitura_uint16_t = sdCardBuf.fill("}log",4); //Reaproveitando uma variável de 16bit
+               if((!modemCom::status.emComunicacao)&&(!sdCard::arquivoAberto())){
+                    sdCard::insereDadosArquivo(&sdCard::armazenamento,sdCardBuf.get(),leitura_uint16_t);
+               }
+               
+               this->execAct(this->alarms[alarmIndex].idAct);
+           }else{
+               printf("Alarm RELEASE! id <%lu>.\n",this->alarms[alarmIndex].id);               
+               sdCardBuf.fill("log{alarm:event:release;id:",27);
+               sprintf(aux,"%lu",this->alarms[alarmIndex].id);
+               sdCardBuf.fill(aux,strlen(aux));                              
+               
+               sdCardBuf.fill(";timestamp:",11);
+               sprintf(aux,"%lu",time(NULL));
+               sdCardBuf.fill(aux,strlen(aux));               
+               
+               leitura_uint16_t = sdCardBuf.fill("}log",4); //Reaproveitando uma variável de 16bit
+               if((!modemCom::status.emComunicacao)&&(!sdCard::arquivoAberto())){
+                    sdCard::insereDadosArquivo(&sdCard::armazenamento,sdCardBuf.get(),leitura_uint16_t);
+               }
+            }                        
+            //atrasa o envio em 3 segundos para que possa ser gravado o registro do alarme.
+            enviaDadosPorAlarme=10;            
+        }
+       
+        /*printf("\n\nAlarme \"%s\".\n",this->alarms[alarmIndex].name);
+        printf("\nsecAlarme <%lu>.\n",this->alarms[alarmIndex].secAlarm);
+        printf("\nthis->alarms[alarmIndex].alarmFound <%lu>.\n",this->alarms[alarmIndex].alarmFound);
+        printf("\nalarmFound <%lu>.\n",alarmFound);
+        printf("\nmax <%lu>.\n",this->alarms[alarmIndex].max);*/        
+    }    
+}
+
+void device::verifySchedules(){
+    char stringTime[15];
+    char *weekdayString;
+    time_t seconds = time(NULL);
+    uint8_t hora;
+    uint16_t minuto;
+    uint8_t weekday=0;
+    const char* weekdayTable[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
+    uint8_t indexSchedule;
+    
+    //Tue,19:09    
+    strftime(stringTime, 15, "%a,%R", localtime(&seconds));    
+    
+    weekdayString = strtok(stringTime,",");    
+    weekday = 0;
+    while((weekday<10)&&(strstr(weekdayTable[weekday],weekdayString)==NULL)){
+        weekday++;
+    }    
+    hora = atoi(strtok(NULL,":"));
+    minuto = atoi(strtok(NULL,""));
+    minuto = (hora*60)+minuto;    
+    for(indexSchedule = 0; indexSchedule < qtdSchedules; indexSchedule++){        
+        //this->schedules[indexSchedule].weekday (Sun bit0, Mon bit1, Tue bit2, etc...)
+        if(this->schedules[indexSchedule].weekday&(0x1<<weekday)){                      
+            if(this->schedules[indexSchedule].minute == minuto){
+                //Verifico se já executei e então executo a ação.
+                if(!this->schedules[indexSchedule].actSent){
+                    //Executa a ação;                    
+                    this->execAct(this->schedules[indexSchedule].idAct);
+                    this->schedules[indexSchedule].actSent = true;        
+                }                
+            }else{                
+                this->schedules[indexSchedule].actSent = false;
+             }
+        } 
+    }    
+}
+
+/*
+void device::verifySchedules(){
+    char stringTime[15];
+    char *weekdayString;
+    time_t seconds = time(NULL);
+    uint8_t hora;
+    uint16_t minuto;
+    uint8_t weekday=0;    
+    const char* weekdayTable[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
+    uint8_t indexSchedule;
+    
+    //Tue,19:09    
+    strftime(stringTime, 15, "%a,%R", localtime(&seconds));    
+    
+    weekdayString = strtok(stringTime,",");    
+    weekday = 0;
+    while((weekday<10)&&(strstr(weekdayTable[weekday],weekdayString)==NULL)){
+        weekday++;
+    }
+    weekday++;
+    hora = atoi(strtok(NULL,":"));
+    minuto = atoi(strtok(NULL,""));
+    minuto = (hora*60)+minuto;
+    //printf("\r\n\r\nMinuto %lu.\r\n\r\n",minuto);    
+    for(indexSchedule = 0; indexSchedule < qtdSchedules; indexSchedule++){
+        //printf("Executando item %u do for de schedules.\r\n\r\n",indexSchedule);
+        if((this->schedules[indexSchedule].weekday == weekday)||(this->schedules[indexSchedule].weekday == 0)){
+            //Se for um alarme para o dia de hoje ou o alarme independer de dia (Se o dia for zero)
+            //printf("Hoje eh dia de executar a acão do schedule indice %u.\r\n\r\n",indexSchedule);
+            if(this->schedules[indexSchedule].minute == minuto){
+                //Verifico se já executei e então executo a ação.
+                if(!this->schedules[indexSchedule].actSent){
+                    //Executa a ação;
+                    //printf("Executando a acao!\r\n\r\n");
+                    this->execAct(this->schedules[indexSchedule].idAct);
+                    this->schedules[indexSchedule].actSent = true;        
+                }                
+            }else{                
+                this->schedules[indexSchedule].actSent = false;
+             }
+        } 
+    }    
+}
+*/
+/*
+uint8_t device::execActSchedule(uint32_t index){            
+    switch(this->schedules[index].actType){        
+        case modBusType_float:
+                float floatValueToWrite;
+                //writeFloat(uint8_t,uint16_t,uint8_t,float*);
+                this->floatToBin(0,&floatValueToWrite,&this->schedules[index].actValue[0]);                    
+                modBusMaster1::writeFloat(
+                    this->schedules[index].param1,
+                    this->schedules[index].param2,
+                    this->schedules[index].param3,
+                    &floatValueToWrite
+                );                    
+            break;
+        case modBusType_uint32_t:
+                uint32_t uint32ValueToWrite;                
+                this->uint32_t_ToBin(0,&uint32ValueToWrite,&this->schedules[index].actValue[0]);                    
+                modBusMaster1::writeRegister32BIT(
+                    this->schedules[index].param1,
+                    this->schedules[index].param2,
+                    this->schedules[index].param3,
+                    &uint32ValueToWrite
+                );                    
+            break;
+        case modBusType_uint16_t:
+                uint16_t uint16ValueToWrite;                
+                this->uint16_t_ToBin(0,&uint16ValueToWrite,&this->schedules[index].actValue[0]);                    
+                modBusMaster1::writeRegister16BIT(
+                    this->schedules[index].param1,
+                    this->schedules[index].param2,
+                    this->schedules[index].param3,
+                    &uint16ValueToWrite
+                ); 
+            break;
+        case modBusType_bit:
+                bool boolValueToWrite;                
+                boolValueToWrite = (this->schedules[index].actValue[0] != 0);                    
+                modBusMaster1::writeSingleCoil(
+                    this->schedules[index].param1,                    
+                    this->schedules[index].param3,
+                    boolValueToWrite
+                ); 
+            break;
+        case IrCommandType:
+                //Busca no arquivo
+                //Abre arquivo
+                char comandoIr[1024];
+                char indexBusca[10]; 
+                bool endOfFile = false;               
+                
+                //printf("\r\n===================DEBUG(Schedule)===================\r\n");
+                //"Ir:0,6E01FFFFS"
+                sprintf(indexBusca,"Ir:%u,",this->schedules[index].param3);
+                //printf("indexBusca = <%s>.\r\n",indexBusca);
+                if(sdCard::abreArquivo(&sdCard::devices,"r")){                
+                    do{
+                        fgets(comandoIr,1024,sdCard::devices.fp);                                            
+                        endOfFile = feof(sdCard::devices.fp);                        
+                        //printf("Linha comando Ir = <%s>.\r\nendOfFile = %u\r\n",comandoIr,endOfFile);
+                    }while((strstr(comandoIr,indexBusca)==NULL)&&(endOfFile==0));                    
+                    sdCard::fechaArquivo(&sdCard::devices);
+                    
+                    //Vê se deu tudo certo, se não encontrou, retorna false
+                    if(!endOfFile){
+                        //Encontrado o comando, vou desempacotar ele.
+                        strtok(comandoIr,",");                        
+                        //Neste ponto já tenho o meu comando pronto para ser executado dentro de comandoIr;
+                        //printf("\r\n\r\n\r\nEstou enviando o comando %s de dentro do schedule.\r\n\r\n\r\n",strtok(NULL,"S"));
+                        deserializaPacoteIR(strtok(NULL,"S"));
+                        enviaComandoIR(this->schedules[index].param1,this->schedules[index].param2);    
+                    }                    
+                }else{
+                    return false;
+                 }
+                //printf("\r\n===================DEBUG(Schedule)===================\r\n");
+            break;        
+    }  
+    return true;  
+}
+*/
+/*
+uint8_t device::execActAlarm(uint32_t index){
+    switch(this->alarms[index].actType){        
+        case modBusType_float:
+                float floatValueToWrite;
+                //writeFloat(uint8_t,uint16_t,uint8_t,float*);
+                this->floatToBin(0,&floatValueToWrite,&this->alarms[index].actValue[0]);                    
+                modBusMaster1::writeFloat(
+                    this->alarms[index].addrModbusWrite,
+                    this->alarms[index].funcModbusWrite,
+                    this->alarms[index].regModbusWrite,
+                    &floatValueToWrite
+                );                    
+            break;
+        case modBusType_uint32_t:
+                uint32_t uint32ValueToWrite;                
+                this->uint32_t_ToBin(0,&uint32ValueToWrite,&this->alarms[index].actValue[0]);                    
+                modBusMaster1::writeRegister32BIT(
+                    this->alarms[index].addrModbusWrite,
+                    this->alarms[index].funcModbusWrite,
+                    this->alarms[index].regModbusWrite,
+                    &uint32ValueToWrite
+                );                    
+            break;
+        case modBusType_uint16_t:
+                uint16_t uint16ValueToWrite;                
+                this->uint16_t_ToBin(0,&uint16ValueToWrite,&this->alarms[index].actValue[0]);                    
+                modBusMaster1::writeRegister16BIT(
+                    this->alarms[index].addrModbusWrite,
+                    this->alarms[index].funcModbusWrite,
+                    this->alarms[index].regModbusWrite,
+                    &uint16ValueToWrite
+                ); 
+            break;
+        case modBusType_bit:
+                bool boolValueToWrite;                
+                boolValueToWrite = (this->alarms[index].actValue[0] != 0);                    
+                modBusMaster1::writeSingleCoil(
+                    this->alarms[index].addrModbusWrite,                    
+                    this->alarms[index].regModbusWrite,
+                    boolValueToWrite
+                ); 
+            break;        
+    }  
+    return true;  
+}
+*/
+
+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,"bit,")) {
+        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))) {                        
+            
+            //Inicialização de contadores de alarme            
+                //É necessário inicializar estes dados para quando a máquina de alarmes rodar ter um inicio correto.
+                this->alarms[this->numAlarms].secAlarm=0;
+                this->alarms[this->numAlarms].idAct=0;
+                this->alarms[this->numAlarms].alarmFound = false;            
+            //Inicialização de contadores de alarme
+            
+            this->numAlarms++;            
+        }
+    }
+
+    if(strstr(linha,"id:")) {
+        strtok(linha,":");
+        this->alarms[this->numAlarms-1].id = atoi(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,"act:")) {        
+        strtok(linha,":");        
+        this->alarms[this->numAlarms-1].idAct = atoi(strtok(NULL,""));
+        return;
+    }           
+    
+   
+    if(strstr(linha,"bit,")){        
+        this->alarms[this->numAlarms-1].type=modBusType_bit;        
+    
+        pChar = 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,",");
+        this->alarms[this->numAlarms-1].max = (atoi(pChar) != 0); //Qualquer valor diferente de 0 é um
+        
+        //Parametro5
+        pChar = strtok(NULL,",");
+        this->alarms[this->numAlarms-1].value[0]= (atoi(pChar) != 0); //Qualquer valor diferente de 0 é um
+    }
+    
+    
+    if(strstr(linha,"float,")) {
+        this->alarms[this->numAlarms-1].type=modBusType_float;        
+        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,",");
+        this->alarms[this->numAlarms-1].max = (atoi(pChar) != 0); //Qualquer valor diferente de 0 é um
+                       
+        //Parametro 5;
+        pChar = strtok(NULL,"\r\n");        
+        //floatVar = diversos::stringToFloat(pChar,100);        
+        floatVar = atof(pChar);        
+    
+        this->floatToBin(1,&floatVar,&this->alarms[this->numAlarms-1].value[0]);
+    }
+    
+    if(strstr(linha,"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);
+    
+        //Parametro 4;
+        pChar = strtok(NULL,",");
+        this->alarms[this->numAlarms-1].max = (atoi(pChar) != 0); //Qualquer valor diferente de 0 é um
+        
+        //parametro5
+        pChar = strtok(NULL,"\r\n");    
+        aux32_t = atoi(pChar);
+        
+        this->uint32_t_ToBin(1,&aux32_t,&this->alarms[this->numAlarms-1].value[0]);
+    }    
+    
+    
+    
+    if(strstr(linha,"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);
+        
+        //Parametro 4;
+        pChar = strtok(NULL,",");
+        this->alarms[this->numAlarms-1].max = (atoi(pChar) != 0); //Qualquer valor diferente de 0 é um
+        
+        //parametro5
+        pChar = strtok(NULL,"\r\n");    
+        aux16_t = atoi(pChar);
+        
+        this->uint16_t_ToBin(1,&aux16_t,&this->alarms[this->numAlarms-1].value[0]);
+    }    
+    
+                
+}
+
+void device::setSchedule(char *linha)
+{    
+    //float floatVar;
+    //uint32_t aux32_t;
+    //uint16_t aux16_t;
+    char *pChar;    
+
+    if(strstr(linha,"scheduleSet")) {
+        if(resizeArray(this->numSchedules, this->numSchedules+1, (char **)&this->schedules,sizeof(schedule))) {
+            //Inicialização de contadores de schedules
+                //É necessário inicializar estes dados para quando a máquina de schedules rodar ter um inicio correto.                
+                this->schedules[this->numSchedules].actSent = false;            
+            //Inicialização de contadores de schedules            
+            this->numSchedules++;            
+        }
+    }
+
+    if(strstr(linha,"id:")) {
+        strtok(linha,":");
+        this->schedules[this->numSchedules-1].id = atoi(strtok(NULL,"\r\n"));
+    }
+
+    
+    if(strstr(linha,"dayTime:")) {        
+        strtok(linha,":");
+        pChar = strtok(NULL,",");
+        this->schedules[this->numSchedules-1].weekday = atoi(pChar);
+        pChar = strtok(NULL,"\r\n");
+        this->schedules[this->numSchedules-1].minute = atoi(pChar);
+    }
+    
+    if(strstr(linha,"act:")) {        
+        strtok(linha,":");
+        pChar = strtok(NULL,"");
+        this->schedules[this->numSchedules-1].idAct = atoi(pChar);        
+    }  
+}
+
+/*void device::writeReadingsToSD(){    
+    //Esta função faz a inserção de todos os dados no arquivo armazenamento.            
+    uint16_t readingIndex=0;    
+    
+    float *floatBuffer;
+    uint32_t *uint32_tBuffer;
+    uint16_t *uint16_tBuffer;    
+    bool *boolBuffer;    
+    uint32_t seconds_uint32_t;
+    
+    //char registro[1024];
+    //uint16_t indexRegistro;
+    
+    seconds_uint32_t = (uint32_t) time(NULL);
+    
+    //Inicio da string dentro do arquivo binario
+    sdCard::insereDadosArquivo(&sdCard::armazenamento,"log{data:",9);            
+    
+    //O timestamp é posto nos 4 primeiros bytes (segundos)    
+    sdCard::insereDadosArquivo(&sdCard::armazenamento,(char *)&seconds_uint32_t,4);
+    
+    for(readingIndex = 0;readingIndex < this->numReadings;readingIndex++){
+        switch(this->readings[readingIndex].type){
+            case modBusType_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
+                    );
+                    //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());
+                    sdCard::insereDadosArquivo(&sdCard::armazenamento,(char *)floatBuffer,sizeof(float)*this->readings[readingIndex].numRegs);
+                    free(floatBuffer);
+                break;
+            case modBusType_uint32_t:
+                    uint32_tBuffer = (uint32_t*) malloc(this->readings[readingIndex].numRegs*sizeof(uint32_t));                                        
+                    modBusMaster1::readRegister32BIT(
+                        this->readings[readingIndex].addr,
+                        this->readings[readingIndex].func,
+                        this->readings[readingIndex].reg,
+                        this->readings[readingIndex].numRegs,
+                        uint32_tBuffer
+                    );
+                    //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());
+                    sdCard::insereDadosArquivo(&sdCard::armazenamento,(char *)uint32_tBuffer,sizeof(uint32_t)*this->readings[readingIndex].numRegs);
+                    free(uint32_tBuffer);            
+                break;
+                
+            case modBusType_uint16_t:
+                    uint16_tBuffer = (uint16_t*) malloc(this->readings[readingIndex].numRegs*sizeof(uint16_t));                                        
+                    modBusMaster1::readRegister16BIT(
+                        this->readings[readingIndex].addr,
+                        this->readings[readingIndex].func,
+                        this->readings[readingIndex].reg,
+                        this->readings[readingIndex].numRegs,
+                        uint16_tBuffer
+                    );
+                    //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());
+                    sdCard::insereDadosArquivo(&sdCard::armazenamento,(char *)uint16_tBuffer,sizeof(uint16_t)*this->readings[readingIndex].numRegs);
+                    free(uint16_tBuffer); 
+                break;
+            
+            case modBusType_bit:
+                    boolBuffer = (bool*) malloc(this->readings[readingIndex].numRegs*sizeof(bool));                                        
+                    modBusMaster1::readCoils(
+                        this->readings[readingIndex].addr,                        
+                        this->readings[readingIndex].reg,
+                        this->readings[readingIndex].numRegs,
+                        boolBuffer
+                    );
+                    //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());
+                    sdCard::insereDadosArquivo(&sdCard::armazenamento,(char *)boolBuffer,sizeof(bool)*this->readings[readingIndex].numRegs);
+                    free(boolBuffer); 
+                break;
+            
+        }
+    }    
+    sdCard::insereDadosArquivo(&sdCard::armazenamento,"}log",4);
+}*/
+
+uint8_t device::execAct(uint32_t index){
+    //Primeiro preciso decidir que tipo de act estou lidando para tanto preciso pegar a ACT inteira.
+    //Busca no arquivo
+    //Abre arquivo
+    char actString[1024];
+    char indexBusca[15];
+    char *pTipoComando; 
+    uint8_t tipoComando;
+    bool endOfFile = false;
+
+    //Variáveis comuns;
+    uint8_t param1;
+    uint8_t param2;
+    uint16_t param3;
+    uint32_t param4;
+    
+    //printf("\r\n===================DEBUG(execAct)===================\r\n"); 
+    sprintf(indexBusca,"actId:%lu,",index);
+    //printf("Buscando por indexBusca<%s>.\r\n",indexBusca);  
+    if(sdCard::abreArquivo(&sdCard::devices,"r")){
+        do{
+            endOfFile = feof(sdCard::devices.fp);                        
+            if(!endOfFile){fgets(actString,1024,sdCard::devices.fp);}
+            //printf("Linha ACT = <%s>.\r\nendOfFile = %u\r\n",actString,endOfFile);            
+        }while((strstr(actString,indexBusca)==NULL)&&(endOfFile==0));                    
+        sdCard::fechaArquivo(&sdCard::devices);
+        
+        //Vê se deu tudo certo, se não encontrou, retorna false
+        if(endOfFile){
+            return false;
+        }
+        //Tudo correndo bem.
+        
+        //printf("\r\nPoint 1\r\n");
+        
+        //Encontrado o tipo de comando reutilizando a string indexBusca;
+        strtok(actString,",");
+        pTipoComando = strtok(NULL,",");
+        //printf("\r\nPoint 2 comando <%s>\r\n",pTipoComando);
+        if(strstr(pTipoComando,"float")){tipoComando = modBusType_float;}
+        if(strstr(pTipoComando,"bit")){tipoComando = modBusType_bit;}
+        if(strstr(pTipoComando,"uint8_t")){tipoComando = modBusType_uint8_t;}
+        if(strstr(pTipoComando,"uint16_t")){tipoComando = modBusType_uint16_t;}
+        if(strstr(pTipoComando,"uint32_t")){tipoComando = modBusType_uint32_t;}
+        if(strstr(pTipoComando,"ir")){tipoComando = IrCommandType;}
+    }else{
+            return false;
+     }
+     
+    switch(tipoComando){        
+        case modBusType_float:
+                float floatValueToWrite;
+                uint32_t auxMod;
+                param1 = atoi(strtok(NULL,","));
+                param2 = atoi(strtok(NULL,","));
+                param3 = atoi(strtok(NULL,","));                
+                //floatValueToWrite = diversos::stringToFloat(strtok(NULL,","),100);                
+                floatValueToWrite = atof(strtok(NULL,","));
+                
+                if(param1 != 254){
+                    //Envio comando via Modbus                
+                    modBusMaster1::writeFloat(
+                        param1,
+                        param2,
+                        param3,
+                        &floatValueToWrite
+                    );              
+                }else{
+                    //Executa comando interno;
+                    auxMod = floatValueToWrite/10;
+                    floatValueToWrite = floatValueToWrite-(auxMod*10);
+                    SD1.period_us(auxMod);
+                    switch(param3){
+                        case 0:                                
+                                SD1.write(floatValueToWrite);
+                            break;
+                        case 1:
+                                SD2.write(floatValueToWrite);
+                            break;
+                        case 2:
+                                SD3.write(floatValueToWrite);
+                            break;
+                        case 3:
+                                SD4.write(floatValueToWrite);
+                            break;
+                        case 4:
+                                SD5.write(floatValueToWrite);
+                            break;
+                        case 5:
+                                SD6.write(floatValueToWrite);
+                            break;                                                 
+                    }   
+                 }
+            break;
+        case modBusType_uint32_t:                
+                param1 = atoi(strtok(NULL,","));
+                param2 = atoi(strtok(NULL,","));
+                param3 = atoi(strtok(NULL,","));
+                param4 = atoi(strtok(NULL,","));                
+                
+                modBusMaster1::writeRegister32BIT(
+                    param1,
+                    param2,
+                    param3,
+                    &param4
+                );                    
+            break;
+        case modBusType_uint16_t:
+                uint16_t param4_uint16_t;
+                param1 = atoi(strtok(NULL,","));
+                param2 = atoi(strtok(NULL,","));
+                param3 = atoi(strtok(NULL,","));
+                param4_uint16_t = atoi(strtok(NULL,","));                
+                
+                modBusMaster1::writeRegister16BIT(
+                    param1,
+                    param2,
+                    param3,
+                    &param4_uint16_t
+                ); 
+            break;
+        case modBusType_bit:                
+                param1 = atoi(strtok(NULL,","));
+                param2 = atoi(strtok(NULL,","));
+                param3 = atoi(strtok(NULL,","));
+                param4 = atoi(strtok(NULL,","));
+                
+                if(param1 != 254){
+                    //Envia comando via Modbus
+                    modBusMaster1::writeSingleCoil(
+                        param1,                    
+                        param3,
+                        (bool)param4
+                    );
+                }else{
+                    //Executa comando interno;
+                    switch(param3){
+                        case 0:
+                                SD1.write(param4*1.0f);
+                            break;
+                        case 1:
+                                SD2.write(param4*1.0f);
+                            break;
+                        case 2:
+                                SD3.write(param4*1.0f);
+                            break;
+                        case 3:
+                                SD4.write(param4*1.0f);
+                            break;
+                        case 4:
+                                SD5.write(param4*1.0f);
+                            break;
+                        case 5:
+                                SD6.write(param4*1.0f);
+                            break;
+                        case 6:
+                                SD7 = param4;
+                            break;                            
+                        case 7:
+                                SD8 = param4;
+                            break;                            
+                    }   
+                 }
+            break;
+        case IrCommandType:
+                //Busca no arquivo
+                //Abre arquivo                
+                //printf("\r\nIniciando execucao de comando IR\r\n");
+                param1 = atoi(strtok(NULL,","));
+                param2 = atoi(strtok(NULL,","));          
+                //printf("\r\nparam 1 %lu, param2 %lu\r\n",param1,param2);
+                pTipoComando = strtok(NULL,"S");//Reaproveitando variável pTipoComando
+                //printf("\r\nPacote IR <%s>.\r\n",pTipoComando);    
+                deserializaPacoteIR(pTipoComando);
+                enviaComandoIR(param1,param2);                    
+            break;
+        default:
+                //printf("comando nao encontrado\r\n");
+            break;        
+    }
+    //printf("\r\n===================DEBUG(execAct)===================\r\n");    
+    return true;  
+}
+
+void device::writeReadingsToSD(){ 
+    //Buffering before insertData   
+    //Esta função faz a inserção de todos os dados no arquivo armazenamento.            
+    uint16_t readingIndex=0;    
+    /*
+    union {
+        char c[4];
+        float v;
+    }uFloat;
+    */
+    float *floatBuffer;
+    uint32_t *uint32_tBuffer;
+    uint16_t *uint16_tBuffer;    
+    bool *boolBuffer;    
+    uint32_t seconds_uint32_t;
+    char seconds_char[5];    
+    
+    seconds_uint32_t = (uint32_t) time(NULL);
+    seconds_char[0]=(seconds_uint32_t >> 0) & 0xFF;
+    seconds_char[1]=(seconds_uint32_t >> 8) & 0xFF;
+    seconds_char[2]=(seconds_uint32_t >> 16) & 0xFF;
+    seconds_char[3]=(seconds_uint32_t >> 24) & 0xFF;
+    seconds_char[4]=0;
+    
+    
+    //Inicio da string dentro do arquivo binario
+    //sdCardBuf.del();
+    sdCardBuf.fill("log{data:",9);            
+    
+    //O timestamp é posto nos 4 primeiros bytes (segundos)    
+    sdCardBuf.fill(seconds_char,5);
+    
+    for(readingIndex = 0;readingIndex < this->numReadings;readingIndex++){
+        switch(this->readings[readingIndex].type){
+            case modBusType_float:                    
+                    if(this->readings[readingIndex].addr != 0){
+                        //Busca externa via Modbus
+                        floatBuffer = (float*) malloc(((this->readings[readingIndex].numRegs*sizeof(float))+1)); //Alocando mais um byte para status
+                        ((char *)floatBuffer)[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
+                        );    
+                    }else{
+                        //Busca Interna
+                        floatBuffer = (float*) malloc(sizeof(float));
+                        //Populando floatBuffer com a entrada analógica
+                        floatBuffer[0] = aiFiltrada[this->readings[readingIndex].reg];                        
+                     }
+                    
+                    //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());
+                    sdCardBuf.fill((char *)floatBuffer,((sizeof(float)*this->readings[readingIndex].numRegs)+1));//Ao fim appendo o byte de status
+                    free(floatBuffer);
+                break;
+            case modBusType_uint32_t:
+                    uint32_tBuffer = (uint32_t*) malloc((this->readings[readingIndex].numRegs*sizeof(uint32_t))+1); //Alocando mais um byte para status
+                    ((char *) uint32_tBuffer)[(this->readings[readingIndex].numRegs*sizeof(uint32_t))]=modBusMaster1::readRegister32BIT(//Ponho o status no ultimo byte
+                        this->readings[readingIndex].addr,
+                        this->readings[readingIndex].func,
+                        this->readings[readingIndex].reg,
+                        this->readings[readingIndex].numRegs,
+                        uint32_tBuffer
+                    );
+                    //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());
+                    sdCardBuf.fill((char *)uint32_tBuffer,((sizeof(uint32_t)*this->readings[readingIndex].numRegs)+1));//Ao fim appendo o byte de status
+                    free(uint32_tBuffer);            
+                break;
+                
+            case modBusType_uint16_t:                    
+                    if(this->readings[readingIndex].addr!=255){
+                        uint16_tBuffer = (uint16_t*) malloc(((this->readings[readingIndex].numRegs*sizeof(uint16_t))+1));//Alocando mais um byte para status
+                        ((char *) uint16_tBuffer)[this->readings[readingIndex].numRegs*sizeof(uint16_t)]=modBusMaster1::readRegister16BIT(//
+                            this->readings[readingIndex].addr,
+                            this->readings[readingIndex].func,
+                            this->readings[readingIndex].reg,
+                            this->readings[readingIndex].numRegs,
+                            uint16_tBuffer
+                        );
+                        //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());
+                        sdCardBuf.fill((char *)uint16_tBuffer,((sizeof(uint16_t)*this->readings[readingIndex].numRegs)+1));//Ao fim appendo o byte de status
+                        free(uint16_tBuffer); 
+                    }else{
+                        if((this->readings[readingIndex].reg>0)&&((this->readings[readingIndex].reg + this->readings[readingIndex].numRegs)<=4)){                                                        
+                            sdCardBuf.fill((char *)&aiFiltrada[this->readings[readingIndex].reg-1],sizeof(uint16_t)*this->readings[readingIndex].numRegs);    
+                        }
+                     }
+                break;
+            
+            case modBusType_bit:
+                    if(this->readings[readingIndex].addr != 0){
+                        boolBuffer = (bool*) malloc(((this->readings[readingIndex].numRegs*sizeof(bool))+1));//Alocando mais um byte para status
+                        ((char *)boolBuffer)[this->readings[readingIndex].numRegs*sizeof(bool)]=modBusMaster1::readCoils(
+                            this->readings[readingIndex].addr,                        
+                            this->readings[readingIndex].reg,
+                            this->readings[readingIndex].numRegs,
+                            boolBuffer
+                        );
+                    }else{
+                        boolBuffer = (bool*) malloc(sizeof(bool));
+                        boolBuffer[0] = entradasDigitais[this->readings[readingIndex].reg];
+                     }
+                    //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());
+                    sdCardBuf.fill((char *)boolBuffer,((sizeof(bool)*this->readings[readingIndex].numRegs)+1));//Ao fim appendo o byte de status
+                    free(boolBuffer); 
+                break;
+            
+        }
+    }    
+    readingIndex = sdCardBuf.fill("}log",4); //Reaproveitando a variável de 16bit readingIndex
+    if((!modemCom::status.emComunicacao)&&(!sdCard::arquivoAberto())){
+        //Insiro os dados se for possível.
+        sdCard::insereDadosArquivo(&sdCard::armazenamento,sdCardBuf.get(),readingIndex);
+    }
+}
+
+
+
+
+
+
+
+
+device::device()
+{
+    this->numAlarms=0;
+    this->numReadings=0;
+}
+
+int criaDevices(FILE *devicesCfg)
+{
+    char linha[maxCaractereLeLinha];
+    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,"scheduleSet")) {
+            //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);
+            qtdSchedules++;
+            estadoConfiguracao = estadoConfiguracao_scheduleSet;
+        }
+
+        if(strstr(linha,"schedulesEnd")) {
+            //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;
+            case estadoConfiguracao_scheduleSet:
+                //Inclue linha nas leituras do dispositivo em configuração
+                dispositivos[dispositivoEmConfiguracao]->setSchedule(linha);
+                break;                
+        }
+
+        linhas++;
+    }
+    printf("Contei %u linha(s), configurei %u dispositivo(s), instalei %u alarme(s) e %u schedule(s) nos dispositivo(s).\n",linhas,devices,alarmes,qtdSchedules);    
+    return 1;
+}
+
+
+
+void testaTudoDevices()
+{
+    int i;
+    int j;
+
+    for(i=0; i<devices; i++) {
+        printf("Dispositivo %u tem %u alarmes sendo eles:\n",i,dispositivos[i]->numAlarms);
+
+        for(j=0; j<dispositivos[i]->numAlarms; j++) {
+            printf("Alarme %u:\n",j);
+            printf("\tId <%lu>.\n",dispositivos[i]->alarms[j].id);
+            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 value;
+                dispositivos[i]->floatToBin(0,&value,&dispositivos[i]->alarms[j].value[0]);                
+                if(dispositivos[i]->alarms[j].max){
+                    printf("\tFloat max <%f>.\n",value);
+                }
+                else{printf("\tFloat min <%f>.\n",value);}
+            }
+            
+            if(dispositivos[i]->alarms[j].type==modBusType_uint32_t) {
+                uint32_t value;
+                dispositivos[i]->uint32_t_ToBin(0,&value,&dispositivos[i]->alarms[j].value[0]);
+                if(dispositivos[i]->alarms[j].max){
+                    printf("\tuint32_t max <%lu>.\n",value);
+                }
+                else{printf("\tuint32_t min <%lu>.\n",value);}
+            }
+            
+            if(dispositivos[i]->alarms[j].type==modBusType_uint16_t) {
+                uint16_t value;
+                dispositivos[i]->uint16_t_ToBin(0,&value,&dispositivos[i]->alarms[j].value[0]);
+                if(dispositivos[i]->alarms[j].max){
+                    printf("\tuint16_t max <%lu>.\n",value);
+                }
+                else{printf("\tuint16_t min <%lu>.\n",value);}
+            }            
+            
+            if(dispositivos[i]->alarms[j].type==modBusType_bit) {
+                uint8_t value;
+                value=dispositivos[i]->alarms[j].value[0];                
+                if(dispositivos[i]->alarms[j].max){
+                    printf("\tBIT max <%lu>.\n",value);
+                }
+                else{printf("\tBIT min <%lu>.\n",value);}
+            }            
+            
+            printf("\tact:%lu\n",dispositivos[i]->alarms[j].idAct);
+        }
+        
+        printf("Dispositivo %u tem %u schedules sendo eles:\n",i,dispositivos[i]->numSchedules);
+        
+        for(j=0; j<dispositivos[i]->numSchedules; j++) {
+            printf("Schedule %u:\n",j);
+            printf("\tId <%lu>.\n",dispositivos[i]->schedules[j].id);
+            printf("\tweekday <%lu>.\n",dispositivos[i]->schedules[j].weekday);
+            printf("\tminute <%lu>.\n",dispositivos[i]->schedules[j].minute);
+            printf("\tidAct <%lu>.\n",dispositivos[i]->schedules[j].idAct);
+        }
+
+        printf("Dispositivo %u tem %u leituras sendo elas:\n",i,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);
+        }
+    }
+}