teste de publish
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
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 }
Generated on Wed Jul 13 2022 12:46:24 by 1.7.2