teste de publish

Revision:
14:2e311903f224
Parent:
13:c1122e7b0b36
--- a/devices.cpp	Mon Jan 29 14:22:18 2018 +0000
+++ b/devices.cpp	Sat Feb 03 20:14:15 2018 +0000
@@ -1302,18 +1302,18 @@
     //Coletando dados do alarmSet e alarmReset    
     
     pChar = strtok(alarmsSetString,",");
-    while(pChar!=NULL){
-        pc.printf("Lido Alarm Set %lu - <%lu>.\r\n",indexAlarms,atoi(pChar));
+    while(pChar!=NULL){        
         if(atoi(pChar)){
+            pc.printf("Lido Alarm Set <%lu>.\r\n",atoi(pChar));
             dispositivos[0]->alarmOnOff(atoi(pChar),1);
         }
         pChar = strtok(NULL,",");
     }
     
     pChar = strtok(alarmsResetString,",");
-    while(pChar!=NULL){
-        pc.printf("Lido Alarm Reset %lu - <%lu>.\r\n",indexAlarms,atoi(pChar));
+    while(pChar!=NULL){        
         if(atoi(pChar)){
+            pc.printf("Lido Alarm Reset <%lu>.\r\n",atoi(pChar));
             dispositivos[0]->alarmOnOff(atoi(pChar),0);
         }
         pChar = strtok(NULL,",");
@@ -1395,30 +1395,33 @@
     //sdCardBuf.del();
     sdCardBuf.fill("log{data:",9);            
     
-    //O timestamp é posto nos 4 primeiros bytes (segundos)    
+    //O timestamp é posto nos 5 primeiros bytes (segundos) status "modbus"
     sdCardBuf.fill(seconds_char,5);
     
     for(readingIndex = 0;readingIndex < this->numReadings;readingIndex++){
         switch(this->readings[readingIndex].type){
-            case modBusType_float:                    
+            case modBusType_float:
+                    //pc.printf("Lido um float.\r\n");
                     if(this->readings[readingIndex].addr != enderecoControladoraVirtual){
                         //Busca externa via Modbus
-                        floatBuffer = (float*) malloc(((this->readings[readingIndex].numRegs*sizeof(float))+1)); //Alocando mais um byte para status
-                        modBusMaster1::readFloat(
+                        floatBuffer = (float*) malloc(this->readings[readingIndex].numRegs*sizeof(float)+1); //Alocando mais um byte para status
+                        //Aqui vou por na ultima posição a resposta modbus.
+                        ((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));
+                        floatBuffer = (float*) malloc(sizeof(float)+1);
+                        ((char *)floatBuffer)[4]=0;;
                         if((this->readings[readingIndex].reg<100)&&(this->readings[readingIndex].reg < num_temperatureSensors)){//Registradores das entradas de temperatura
                             //Populando floatBuffer com a temperaturas                            
                             floatBuffer[0] = temperaturas[this->readings[readingIndex].reg];                            
                         }
-                        if((this->readings[readingIndex].reg>100)&&(this->readings[readingIndex].reg<104)){
+                        if((this->readings[readingIndex].reg>=100)&&(this->readings[readingIndex].reg<104)){
                             //Registradores das entradas analógicas                            
                             floatBuffer[0] = aiFiltrada[this->readings[readingIndex].reg - 100];                            
                         }
@@ -1426,33 +1429,35 @@
                      }
                     
                     //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
+                    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
+                    //pc.printf("Lido um uint32_t.\r\n");
+                    uint32_tBuffer = (uint32_t*) malloc(this->readings[readingIndex].numRegs*sizeof(uint32_t)+1); //Alocando mais um byte para status
                     if(this->readings[readingIndex].addr != enderecoControladoraVirtual){
-                        modBusMaster1::readRegister32BIT(//Ponho o status no ultimo byte
+                        ((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());
+                        );                        
                     }else{
                         uint32_tBuffer[0] = pulsosEDs[this->readings[readingIndex].reg];
                         this->readings[readingIndex].numRegs = 1;
                         pulsosEDs[this->readings[readingIndex].reg] = 0;
                      }
-                    sdCardBuf.fill((char *)uint32_tBuffer,((sizeof(uint32_t)*this->readings[readingIndex].numRegs)+1));//Ao fim appendo o byte de status
+                    ((char*)uint32_tBuffer)[sizeof(uint32_t)]=0;
+                    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:                    
+            case modBusType_uint16_t:
+                    //pc.printf("Lido um uint16_t.\r\n");                    
                     if(this->readings[readingIndex].addr!=enderecoControladoraVirtual){
-                        uint16_tBuffer = (uint16_t*) malloc(((this->readings[readingIndex].numRegs*sizeof(uint16_t))+1));//Alocando mais um byte para status
-                        modBusMaster1::readRegister16BIT(//
+                        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,
@@ -1460,19 +1465,22 @@
                             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
+                        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);    
+                            sdCardBuf.fill((char *)&aiFiltrada[this->readings[readingIndex].reg-1],sizeof(uint16_t)*this->readings[readingIndex].numRegs);
+                            seconds_char[0]=0;
+                            sdCardBuf.fill(seconds_char,1); //Colocando status de leitura aqui tb
                         }
                      }
                 break;
             
             case modBusType_bit:
+                    //pc.printf("Lido um bool.\r\n");
                     if(this->readings[readingIndex].addr != enderecoControladoraVirtual){
-                        boolBuffer = (bool*) malloc(((this->readings[readingIndex].numRegs*sizeof(bool))+1));//Alocando mais um byte para status
-                        modBusMaster1::readCoils(
+                        boolBuffer = (bool*) malloc(sizeof(bool)+1);//Alocando mais um byte para status
+                        ((char*)boolBuffer)[1]=modBusMaster1::readCoils(
                             this->readings[readingIndex].addr,                        
                             this->readings[readingIndex].reg,
                             this->readings[readingIndex].numRegs,
@@ -1480,10 +1488,10 @@
                         );
                     }else{
                         boolBuffer = (bool*) malloc(sizeof(bool));
-                        boolBuffer[0] = entradasDigitais[this->readings[readingIndex].reg];
+                        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
+                    //pc.printf("Lido dentro de modBusMaster1::teste() <%f>.\n",modBusMaster1::teste());                    
+                    sdCardBuf.fill((char *)boolBuffer,(sizeof(bool)+1));//Ao fim appendo o byte de status
                     free(boolBuffer); 
                 break;
             
@@ -1492,6 +1500,7 @@
     readingIndex = sdCardBuf.fill("}log",4); //Reaproveitando a variável de 16bit readingIndex
     sdCard::arquivoAberto(40000);
     //Insiro os dados se for possível.
+    //pc.printf("Enchendo %lu bytes no arquivo.\r\n",readingIndex);
     sdCard::insereDadosBank(sdCardBuf.get(),readingIndex);
 }
 
@@ -1540,12 +1549,13 @@
 
 int configuraDevices(FILE *devicesCfg)
 {
-    uint16_t linhas=0;
-    //uint16_t leituras = 0;
+    uint16_t linhas=0;    
     char linha[maxCaractereLeLinha];
     uint8_t estadoConfiguracao=estadoConfiguracao_idle;
     int8_t dispositivoEmConfiguracao = -1;    
 
+    leituras = 0;
+
     while(fgets(linha,maxCaractereLeLinha,devicesCfg)){        
         if(strstr(linha,"alarmSet")) {
             //printf("Criando alarme no dispositivo de indice %u.\n",dispositivoEmConfiguracao);
@@ -1553,20 +1563,25 @@
             estadoConfiguracao = estadoConfiguracao_alarmSet;
         }        
 
-        /*if(estadoConfiguracao == estadoConfiguracao_readingsSet){
+        if(strstr(linha,"readingsEnd")) {
+            //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);            
+            estadoConfiguracao = estadoConfiguracao_idle;            
+        }
+
+        if(estadoConfiguracao == estadoConfiguracao_readingsSet){
             leituras++;
-        }*/
+        }
 
         if(strstr(linha,"readingsSet")) {
             //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);            
-            estadoConfiguracao = estadoConfiguracao_readingsSet;
-            leituras++;
+            estadoConfiguracao = estadoConfiguracao_readingsSet;            
         }
 
+        
         if(strstr(linha,"scheduleSet")) {
             //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);
             qtdSchedules++;
-            estadoConfiguracao = estadoConfiguracao_scheduleSet;
+            estadoConfiguracao = estadoConfiguracao_idle;
         }
         
         if(strstr(linha,"scheduleExceptionsSet")) {
@@ -1577,7 +1592,7 @@
 
         linhas++;
     }
-    printf("Contei %u linha(s), configurei %u dispositivo(s), instalei %u alarme(s), %u leituras(s) e %u schedule(s) nos dispositivo(s).\n",linhas,devices,alarmes,leituras,qtdSchedules);
+    printf("Contei %u linha(s), configurei %u dispositivo(s), instalei %u alarme(s), %u leitura(s) e %u schedule(s) nos dispositivo(s).\n",linhas,devices,alarmes,leituras,qtdSchedules);
     //Reservar memoria aqui.
     
     //if(resizeArray(this->numReadings, this->numReadings+1, (char **)&this->readings,sizeof(reading))) {        
@@ -1603,12 +1618,6 @@
             estadoConfiguracao = estadoConfiguracao_alarmSet;
         }
 
-        if(strstr(linha,"readingsSet")) {
-            //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);
-            leituras++;
-            estadoConfiguracao = estadoConfiguracao_readingsSet;
-        }
-
         if(strstr(linha,"scheduleExceptionSet")) {
             //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);
             qtdScheduleExceptions++;
@@ -1654,6 +1663,11 @@
                 dispositivos[dispositivoEmConfiguracao]->setScheduleException(linha);
                 break;                
         }
+        
+        if(strstr(linha,"readingsSet")) {
+            //printf("Criando leituras no dispositivo de indice %u.\n",dispositivoEmConfiguracao);            
+            estadoConfiguracao = estadoConfiguracao_readingsSet;
+        }
     }
     
     return 1;