teste de publish

Dependencies:   DS1820 HighSpeedAnalogIn devices mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"   //API mBed com diversos drivers para os periféricos LPC1768
00002 #include "stdio.h"
00003 #include "cmsis_os.h"   //Nucleo do Real Time Operational System
00004 #include "main.h"   //Inicializações de maquina e demais ajustes de hardware
00005 #include "funcoesSDCard.h"  //Funções para manipulação do SDCard que incluem rotinas de inicialização, setar pastas e arquivos e demais usos
00006 #include "RTC.h"    //API de uso das interrupções do Real Time Clock
00007 #include "serialPC.h"   //Funções de comunicação entre RAD e PC via usb
00008 #include "modbusMaster1.h"
00009 //#include "lpc17xx_nvic.h"
00010 
00011 
00012 //Definições de Hardware acessíveis em qualquer modulo
00013 /*LEDs de informação visual*/
00014 DigitalOut ledLigado(P1_0);
00015 DigitalOut ledEmComunicacao(P1_1);
00016 DigitalOut ledConectadoInternet(P1_4);
00017 DigitalOut ledUsoGeral(P1_8);
00018 /*LEDs de informação visual*/
00019 
00020 /*Pinos de controle do modulo WiFi*/
00021 DigitalOut ESP_CH_PD(P0_6);
00022 DigitalOut ESP_RESET(P0_0);
00023 DigitalOut ESP_ESPGPIO_2(P0_1);
00024 /*Pinos de controle do modulo WiFi*/
00025 
00026 /*Interrupções externas para contagem de pulsos rapidos*/
00027 InterruptIn eInt1(P2_11);
00028 InterruptIn eInt2(P2_12);
00029 InterruptIn eInt3(P2_13);
00030 /*Interrupções externas para contagem de pulsos rapidos*/
00031 
00032 /*Leituras analógicas*/
00033 /*AnalogIn   ain1(p17);
00034 AnalogIn   ain2(p18);
00035 AnalogIn   ain3(p19);
00036 AnalogIn   ain4(p20);*/
00037 /*Leituras analógicas*/
00038 
00039 //Função para reset do ARM
00040 extern "C" void mbed_reset();
00041 
00042 //Devices    
00043     uint8_t devices=0;
00044     uint16_t alarmes=0;
00045     uint16_t leituras=0;
00046     uint16_t qtdSchedules=0;
00047     uint16_t qtdScheduleExceptions=0;
00048 //Devices
00049 
00050 //Variáveis para envio de arquivo em qualquer lugar do código
00051 extern arquivoSD *arquivoEnvioPointer = NULL;
00052 
00053 uint32_t act;
00054 bool boolExecAct;
00055 bool inicializaModemBool;
00056 bool debug = false;
00057 bool xeretaModem = false;
00058 bool hardwareReset = false;
00059 char firmVersion[20];
00060 char resetCauses[30];
00061 
00062 
00063 MediaMovel FiltroAI4(5);
00064 MediaMovel FiltroAI3(5);
00065 MediaMovel FiltroAI2(5);
00066 MediaMovel FiltroAI1(5);
00067 
00068 uint16_t aiFiltrada[4];
00069 bool entradasDigitais[9];
00070 
00071 CircularBuffer bufModem(maxBufInModem,0);// __attribute__ ((section("AHBSRAM0")));    
00072 CircularBuffer bufPC(128,0);
00073 CircularBuffer sdCardBuf(1024,0);
00074 
00075 uint8_t enviaDadosPorAlarme = 255;
00076 //bool reportaMudancaAoServer;
00077 bool executaComandoServer;
00078 
00079 //typeConfig flashConfig;  
00080 
00081 //Instancia das portas Seriais do ARM
00082 Serial pc(USBTX, USBRX); //Instancia de recurso Serial uart pc
00083 Serial modem(P0_10,P0_11); //Instancia de recurso Serial uart Modem 
00084 DigitalOut max_de(P2_7); //Pino de habilitação max485 para porta Energy Metering ModBus
00085 Serial modBusMaster1Serial(P2_0,P2_1);  //Recurso serial para porta Energy Metering ModBus
00086 
00087 /*
00088 //Interrupções externas e botões
00089 InterruptIn int_wh(P2_11);
00090 InterruptIn int_varh(P2_12);
00091 
00092 void whCount(void){
00093     whled=1;
00094     wait(0.2);
00095     whled=0;
00096 }
00097 
00098 void varhCount(void){
00099     varhled=1;
00100     wait(0.2);
00101     varhled=0;
00102 }*/
00103 //Definições de Hardware acessíveis em qualquer modulo
00104 
00105 /*
00106 void loadStandardConfig(){ 
00107  strcpy(flashConfig.apnList[0],"claro.com.br");
00108  strcpy(flashConfig.apnList[1],"zap.vivo.com.br");
00109  strcpy(flashConfig.apnList[2],"tim.br");
00110  strcpy(flashConfig.apnList[3],"generica.oi.com.br"); 
00111 
00112  strcpy(flashConfig.login[0],"claro");
00113  strcpy(flashConfig.login[1],"vivo");
00114  strcpy(flashConfig.login[2],"tim");
00115  strcpy(flashConfig.login[3],"oi"); 
00116 
00117  strcpy(flashConfig.senha[0],"claro");
00118  strcpy(flashConfig.senha[1],"vivo");
00119  strcpy(flashConfig.senha[2],"tim");
00120  strcpy(flashConfig.senha[3],"oi"); 
00121 
00122  strcpy(flashConfig.serverAddress,serverAddress); 
00123  
00124  strcpy(flashConfig.serverPort,"80"); 
00125  
00126  flashConfig.periodoDeEnvioDeDadosMinutos=15;  //Padrão 15 minutos
00127  flashConfig.ultimoEstadoLigadoDesligado=0;    //Padrão de fábrica desligado
00128 }
00129 */
00130 
00131 void leiturasDigitais(){    
00132     entradasDigitais[0] = ED1;
00133     entradasDigitais[1] = ED2;
00134     entradasDigitais[2] = ED3;
00135     entradasDigitais[3] = ED4;
00136     entradasDigitais[4] = ED5;
00137     entradasDigitais[5] = ED6;
00138     entradasDigitais[6] = ED7;
00139     entradasDigitais[7] = ED8;
00140     entradasDigitais[8] = ED9;    
00141 }
00142 
00143 HighSpeedAnalogIn ain(p17, p18, p19, p20);
00144 
00145 void leiturasAnalogicas(){
00146     static uint8_t leituraAtual;
00147     switch(leituraAtual){
00148         case 0:                
00149                 aiFiltrada[0] = FiltroAI1.get(ain.read_u16(p17));
00150             break;
00151         case 1:
00152                 aiFiltrada[1] = FiltroAI2.get(ain.read_u16(p18));
00153             break;
00154         case 2:
00155                 aiFiltrada[2] = FiltroAI3.get(ain.read_u16(p19));
00156             break;
00157         case 3:
00158                 aiFiltrada[3] = FiltroAI4.get(ain.read_u16(p20));
00159             break;        
00160     }
00161     if(leituraAtual<3){leituraAtual++;}
00162     else{leituraAtual=0;}
00163 } 
00164 
00165 void verificaSaidasDigitais(){
00166     SD_OE_R = 1;
00167     /*if(SD_FAULT){
00168         if(debug)pc.printf("Fault\r\n");
00169     }else{
00170         if(debug)pc.printf("No Fault\r\n");
00171      }*/
00172 }
00173 
00174 //Thread timers é utilizada para dar start nos timers de dentro das ISRs de comunicação serial porque não é permitido inicializar osTimers de dentro de ISRs.
00175 osThreadId idThreadTimers;
00176 void threadTimers(void const *args){
00177     while(true){
00178         osSignalWait(0x1,1000); //Executo compulsoriamente mesmo que não haja sinal num periodo de 1 segundo        
00179         //if(enviaDadosPorAlarme==255){//debug        
00180             if(serialPC::startTimer_pacote){
00181               serialPC::startTimer_pacote = false;
00182               osTimerStart(serialPC::timer_pacote,100);            
00183             }
00184             if(serialModem::startTimer_pacote){
00185               serialModem::startTimer_pacote = false;
00186               osTimerStart(serialModem::timer_pacote,modemCom::timeOutModem);            
00187             }
00188         //}        
00189         if(modBusMaster1::startThreadModBusMaster){
00190           modBusMaster1::startThreadModBusMaster = false;
00191           osTimerStart(modBusMaster1::timer_pacote,4);            
00192         }                
00193     }        
00194 }
00195 osThreadDef(threadTimers, osPriorityNormal, 128);
00196 
00197 
00198 osThreadId idThreadProcessaPacote;
00199 void threadProcessaPacote(void const *args){
00200     while(true){
00201         osSignalWait(0x1,100); //Executo compulsoriamente mesmo que não haja sinal num periodo de 1 segundo
00202         if(serialModem::processarPacote){
00203             serialModem::processarPacote = false;
00204             modemCom::processaPacote(NULL);
00205         }        
00206     }    
00207 }
00208 osThreadDef(threadProcessaPacote, osPriorityNormal, DEFAULT_STACK_SIZE);
00209 
00210 
00211 
00212 //Thread que gerencia as comunicacoes (DROME - SERVER)
00213 osThreadId idThreadComunicacoes;
00214 void threadComunicacoes(void const *args){
00215     //Esta thread faz todo o tratamento de comunicação.    
00216     
00217     //char aux[30];                   
00218     while(true){                
00219         osSignalWait(0x1,1000); //Libero processamento e executo compulsoriamente mesmo que não haja sinal num periodo de um segundo        
00220         if(inicializaModemBool){
00221             inicializaModemBool = false;
00222             modemCom::conectaWiFi();    
00223         }        
00224               
00225         if(eventosRTC::rotinaEnvioDeDados){
00226             //Faço aqui o que for devido.            
00227             if((!modemCom::status.recebendoArquivoDoServer)&&(enviaDadosPorAlarme==255)){
00228                 if(!modemCom::timeOutEnvioDados){
00229                     modemCom::timeOutEnvioDados=maxTimeEnvioDados;    
00230                 }
00231                 if(debug){pc.printf("Enviando dados de hora completa ao server.\n");}
00232                 modemCom::status.emComunicacao = true;
00233                 eventosRTC::rotinaEnvioDeDados--;
00234                 modemCom::status.periodo = 900;
00235                 diversos::wdt.kick(180);
00236                 if(modemCom::verificaConexao()){
00237                     //Estou conectado                    
00238                     if(modemCom::enviaDados()){
00239                         eventosRTC::rotinaEnvioDeDados=0;
00240                         modemCom::timeOutEnvioDados=0;
00241                         modemCom::status.periodo = modemCom::status.periodoConfiguracao; //Restaurando o período configurado no sistema
00242                     }
00243                 }
00244                 modemCom::status.emComunicacao = false;
00245             }
00246             
00247         }        
00248         
00249         if(arquivoEnvioPointer!=NULL){            
00250             if(debug){pc.printf("Enviando o arquivo <%s> ao server.\n",arquivoEnvioPointer->nome);}
00251             if(modemCom::postFileCommandMode(modemCom::status.serverIP,modemCom::status.host,"/drome/parser/index.php",arquivoEnvioPointer)){
00252             //if(modemCom::postFileCommandMode(modemCom::status.serverIP,modemCom::status.host,"/sistema/Parser/index.php",arquivoEnvioPointer)){
00253                 if(debug){pc.printf("Enviado o arquivo <%s>.\n",arquivoEnvioPointer->nome);}
00254                 arquivoEnvioPointer = NULL;        
00255             }else{
00256                 if(debug){pc.printf("Erro enviando o arquivo <%s>.\n",arquivoEnvioPointer->nome);}
00257              }
00258         }
00259         
00260         if(modemCom::status.SRINGsockEntrante){
00261             modemCom::status.SRINGsockEntrante=false;
00262             modemCom::atendeSRING(modemCom::status.connIDServerCommand);
00263         }
00264         modemCom::timeOutModem = 30;
00265     }
00266 }
00267 //osThreadDef(threadComunicacoes, osPriorityNormal, 3072); 
00268 osThreadDef(threadComunicacoes, osPriorityNormal, (DEFAULT_STACK_SIZE*2)); 
00269 
00270 void RTC_POR_SEGUNDO(void){
00271     time_t seconds;
00272     seconds = time(NULL);        
00273     //osSignalSet(idThreadComunicacoes, 0x1);
00274     eventosRTC::rotina1segundo=true;
00275     
00276     if(((seconds+5)%10)==0){     
00277      eventosRTC::rotina10Segundos = true;                
00278     }
00279     
00280     if((seconds%60)==0){     
00281      eventosRTC::minutos = true;   
00282     }
00283 
00284     if(((seconds-15)%modemCom::status.periodo)==0){
00285     //if((seconds%300)==0){
00286         eventosRTC::rotinaEnvioDeDados = maxTentativasEnvioDados;
00287         osSignalSet(idThreadComunicacoes, 0x1);
00288     }    
00289 }
00290 
00291 void loadDevices(){    
00292     if(sdCard::abreArquivo(&sdCard::devices,"r")){
00293         criaDevices(sdCard::devices.fp);
00294         if(devices){
00295             configuraDevices(sdCard::devices.fp);
00296             printf("Dispositivos configurados.\n");            
00297         }
00298         sdCard::fechaArquivo(&sdCard::devices); 
00299         if(devices){testaTudoDevices();}
00300     }    
00301 }
00302 
00303 void inicializaMaquina(){
00304     //char aux[15];
00305     time_t seconds;
00306     seconds = time(NULL);     
00307     //Resetei pq?    
00308     sprintf(resetCauses,"TSOn:%lu",seconds);
00309     if((LPC_WDT->WDMOD >> 2) & 1){
00310         strcat(resetCauses,",WDT");
00311     }else{strcat(resetCauses,",NOW");}
00312     
00313     diversos::wdt.kick(90.0);
00314     
00315     pwmPeriod = 100000;
00316     SD1.period_us(pwmPeriod);
00317     modemCom::atendendoWebServer = false;
00318     
00319     printf("Versao: %s.\r\n",firmVersion);
00320     printf("Reset Causes: %s.\r\n",resetCauses);
00321     modemCom::timeOutModem = 30;
00322     serialModem::serial_init();
00323     numeroDeBytesPorEnvio = 768;
00324     modBusMaster1::modBusMaster(&modBusMaster1Serial,19200,&max_de);
00325     inicializaSensoresTemperatura();
00326     
00327     if(sdCard::init()){
00328      printf("SD Card inicializado com sucesso.\n");
00329      //Carregando a lista de dispositivos
00330      loadDevices();
00331     }else{
00332         printf("Nao foi possivel inicializar o SD Card.\n");   
00333      }   
00334 
00335           
00336     //Tick Timer por segundo
00337     RTC::attach(&RTC_POR_SEGUNDO, RTC::Second);                  
00338     
00339     /*Chamada de threads*/
00340     
00341     //Thread timers
00342     idThreadTimers = osThreadCreate(osThread(threadTimers), NULL);    
00343     //Thread comunicacoes
00344     idThreadComunicacoes = osThreadCreate(osThread(threadComunicacoes), NULL);
00345     //Thread processaPacote
00346     idThreadProcessaPacote = osThreadCreate(osThread(threadProcessaPacote), NULL);
00347     
00348     /*Chamada de threads*/    
00349     modemCom::status.connIDServerCommand = 255;
00350     modemCom::status.connIDWebServer = 255;
00351     modemCom::status.connIDSendData = 255;    
00352 }
00353 
00354 //Inicio do programa;
00355 int main() {    
00356     //uint8_t i;
00357     ESP_CH_PD = 0;          
00358     ESP_ESPGPIO_2 = 0;
00359     ESP_RESET = 0;
00360 
00361     flashPrepare();
00362     firmDescToRam();
00363     serialPC::serialPC_init();
00364     pc.printf("firmDesc: nome <%s> tamFirmware = %lu executaBootLoader = %u.\r\n",(char*)&memBufConfigBootLoader[5],tamFirmware,executaBootLoader);
00365     
00366     if(executaBootLoader==1){        
00367         executaBootLoader=0;
00368         pc.printf("Chamando o bootloader logo apos dar reset.\r\n");
00369         while( ((LPC_UART0->LSR >> 6) &0x1) == 0 );
00370         //__disable_irq();        
00371         SysTick->CTRL &= ~0x00000002;           // disable SysTick interrupt
00372         NVIC_DeInit();
00373         firmDescToFlash();
00374         bootLoader();        
00375     }
00376     
00377     sprintf(firmVersion,"08/06/18(BL)");
00378     
00379 
00380     eInt1.rise(&diversos::processaPulsosEDs);
00381     eInt2.rise(&diversos::processaPulsosEDs);
00382     eInt3.rise(&diversos::processaPulsosEDs);        
00383     
00384     modem.baud(76800);
00385     
00386     ESP_CH_PD = 1;          
00387     ESP_ESPGPIO_2 = 1;
00388     ESP_RESET = 1;
00389     
00390     wait(5);    
00391     
00392     inicializaMaquina();
00393     modemCom::inicializaModem();
00394     /*if(!modemCom::verificaConexao()){
00395         modemCom::conectaWiFi();
00396     }*/
00397     
00398     //Agendando primeiro envio de cara.
00399     eventosRTC::rotinaEnvioDeDados=maxTentativasEnvioDados;    
00400     osSignalSet(idThreadComunicacoes, 0x1);    
00401     
00402     
00403         
00404     while(true){
00405         osDelay(100);
00406         if(callBootLoader){
00407             diversos::wdt.kick(180.0);
00408             SysTick->CTRL &= ~0x00000002;           // disable SysTick interrupt
00409             NVIC_DeInit();
00410             
00411             //Bloco novo
00412             //SysTick->CTRL = 0;
00413             //SysTick->LOAD = 0;
00414             //SysTick->VAL = 0;
00415         
00416             /**
00417              * Step: Disable all interrupts
00418              */
00419             //__disable_irq();
00420         
00421             /* ARM Cortex-M Programming Guide to Memory Barrier Instructions.*/
00422             //__DSB();
00423             //Bloco novo
00424             //__disable_irq();
00425             //__disable_irq();
00426             bootloader_fillUpFlash(&sdCard::newFirmware);
00427             pc.printf("Logo depois de fillUpFlash firmDesc: nome <%s> tamFirmware = %lu\r\n",(char*)&memBufConfigBootLoader[5],tamFirmware);  
00428             
00429             
00430             NVIC_SystemReset();
00431             /*while( ((LPC_UART0->LSR >> 6) &0x1) == 0 );
00432             //__enable_irq();
00433             bootLoader();*/
00434         }
00435 
00436         /*---------------------Bloco de prevenção de bloqueio-------------------------------*/
00437         if((!modemCom::status.recebendoArquivoDoServer)&&(!modemCom::status.emComunicacao)){
00438             diversos::wdt.kick(180.0);
00439         }else{            
00440             /*-----------------Bloco temporizador de recepção de arquivo--------------*/
00441             if(modemCom::status.recebendoArquivoDoServer){
00442                 if(modemCom::status.recebendoArquivoDoServer==1){
00443                     modemCom::closeConnection(&modemCom::status.connIDServerCommand);                    
00444                     //Insere erro no arquivo.
00445                 }
00446                 modemCom::status.recebendoArquivoDoServer--;                
00447                 if(xeretaModem){pc.printf("recebendoArquivoDoServer = %lu.\r\n",modemCom::status.recebendoArquivoDoServer);}
00448             }
00449             /*-----------------Bloco temporizador de recepção de arquivo--------------*/
00450             
00451             /*-----------------Bloco temporizador de recepção de envio de dados-------*/
00452             if(modemCom::status.emComunicacao){
00453                 if(modemCom::timeOutEnvioDados==1){
00454                     modemCom::status.emComunicacao=0;
00455                     modemCom::closeConnection(&modemCom::status.connIDServerCommand);
00456                     modemCom::closeConnection(&modemCom::status.connIDWebServer);
00457                     modemCom::closeConnection(&modemCom::status.connIDSendData);
00458                     //Insere erro no arquivo.
00459                 }
00460                 modemCom::timeOutEnvioDados--;
00461                 if(xeretaModem){pc.printf("timeOutEnvioDados = %lu.\r\n",modemCom::timeOutEnvioDados);}
00462             }
00463             /*-----------------Bloco temporizador de recepção de envio de dados-------*/
00464          }
00465         /*---------------------Bloco de prevenção de bloqueio-------------------------------*/
00466         
00467         if(executaComandoServer){
00468             executaComandoServer = false;
00469             
00470             commands::exec(modemCom::status.connIDServerCommand);            
00471             if(!modemCom::status.recebendoArquivoDoServer){
00472                 if(debug){pc.printf("Fechando socket chave 4.\r\n");}
00473                 modemCom::closeConnection(&modemCom::status.connIDServerCommand);
00474             }
00475         }        
00476     
00477         if(sdCard::deleteSentFiles){
00478             printf("Recebido comando para deletar arquivos enviados.\n");
00479             sdCard::deleteBanks(sdCard::currentBankSending);
00480             if(sdCard::modificaCurrentBank(sdCard::currentBank,!sdCard::currentBankSending)){
00481                 sdCard::deleteSentFiles=false;
00482             }
00483         }
00484     
00485         if(modemCom::atendendoWebServer){                
00486                 modemCom::atendendoWebServer = false;
00487                 if(debug){pc.printf("Atendendo webServer na conexao %u.\r\n",modemCom::status.connIDWebServer);}
00488                 modemCom::status.emComunicacao=true;
00489                 modemCom::webServer(modemCom::status.connIDWebServer);                
00490                 modemCom::status.emComunicacao=false;
00491         }
00492         
00493         if(boolExecAct){
00494             execAct(act);
00495             boolExecAct = false;    
00496         }        
00497         
00498         if((!modemCom::status.recebendoArquivoDoServer)&&(!modemCom::status.emComunicacao)){
00499             if(eventosRTC::rotina1segundo){
00500                 eventosRTC::rotina1segundo = false;
00501                 if(enviaDadosPorAlarme!=255){
00502                     enviaDadosPorAlarme--;
00503                     if(enviaDadosPorAlarme==0){
00504                         eventosRTC::rotinaEnvioDeDados=maxTentativasEnvioDados;
00505                         enviaDadosPorAlarme=255;                        
00506                     }
00507                 }
00508                 leiturasAnalogicas();                
00509                 verificaSaidasDigitais();
00510                 leiturasDigitais();                
00511             
00512                 if(debug){
00513                     pc.printf("\nMemoria RAM disponivel = %lu\n",diversos::memAvailable());
00514                     //pc.printf("\nEntrada 4 = %lu.\nEntrada 3 = %lu.\nEntrada 2 = %lu.\nEntrada 1 = %lu.\r\n",aiFiltrada[3],aiFiltrada[2],aiFiltrada[1],aiFiltrada[0]);            
00515                     //pc.printf("Pulsos <%lu><%lu><%lu>.\r\n",pulsosEDs[0],pulsosEDs[1],pulsosEDs[2]);                    
00516                 }                    
00517                 time_t seconds = time(NULL);
00518                 pc.printf("Drome %s, %s\n",firmVersion,ctime(&seconds));
00519             }            
00520             if(eventosRTC::rotina10Segundos){                                    
00521                 //Executo abaixo a rotina de 10 segundos
00522                 eventosRTC::rotina10Segundos = false;
00523                 verifySchedules();                
00524                 verifyAlarms();                
00525             }
00526             if((eventosRTC::minutos)){//&&(!modemCom::status.recebendoArquivoDoServer)){
00527                 //Executo abaixo a rotina de 1 minuto
00528                 eventosRTC::minutos = false;
00529                 refreshSensoresTemperatura();
00530                 writeReadingsToSD();
00531             }
00532         }        
00533         
00534         if(hardwareReset){
00535             //Resetando
00536             pc.printf("hardwareReset = true.\r\n");
00537             osDelay(50);      //Para dar tempo de enviar todo o printf.
00538             //diversos::wdt.kick(0.1);
00539             NVIC_SystemReset();            
00540             while(true);
00541         }  
00542     }
00543 }