teste de publish
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
main.cpp
- Committer:
- brunofgc
- Date:
- 2017-03-24
- Revision:
- 0:1c0a769988ee
- Child:
- 1:0e0967c88590
File content as of revision 0:1c0a769988ee:
#include "mbed.h" //API mBed com diversos drivers para os periféricos LPC1768 #include "stdio.h" #include "cmsis_os.h" //Nucleo do Real Time Operational System #include "main.h" //Inicializações de maquina e demais ajustes de hardware #include "funcoesSDCard.h" //Funções para manipulação do SDCard que incluem rotinas de inicialização, setar pastas e arquivos e demais usos #include "RTC.h" //API de uso das interrupções do Real Time Clock #include "serialPC.h" //Funções de comunicação entre RAD e PC via usb #include "modbusMaster1.h" DigitalOut ESP_CH_PD(P0_6); DigitalOut ESP_RESET(P0_0); DigitalOut ESP_ESPGPIO_2(P0_1); uint32_t pwmPeriod; extern "C" void mbed_reset(); //Devices device ** dispositivos = NULL; uint8_t devices=0; uint8_t alarmes=0; uint8_t qtdSchedules=0; //Devices //Variáveis para envio de arquivo em qualquer lugar do código extern arquivoSD *arquivoEnvioPointer = NULL; //Definições de Hardware acessÃveis em qualquer modulo DigitalOut led1(P1_0); DigitalOut led2(P1_1); DigitalOut led3(P1_4); DigitalOut led4(P1_8); bool hardwareReset = false; /* AnalogIn ai4(p20); AnalogIn ai3(p19); AnalogIn ai2(p18); AnalogIn ai1(p17); AnalogIn ai4(P1_31); AnalogIn ai3(P1_30); AnalogIn ai2(P0_26); AnalogIn ai1(P0_25); */ MediaMovel FiltroAI4(5); MediaMovel FiltroAI3(5); MediaMovel FiltroAI2(5); MediaMovel FiltroAI1(5); uint16_t aiFiltrada[4]; bool entradasDigitais[9]; CircularBuffer bufModem(maxBufInModem); CircularBuffer bufPC(128); CircularBuffer sdCardBuf(2048); uint8_t enviaDadosPorAlarme = 255; bool reportaMudancaAoServer; bool executaComandoServer; //typeConfig flashConfig; Serial pc(USBTX, USBRX); //Instancia de recurso Serial uart pc DigitalOut max_de(P2_7); //Pino de habilitação max485 para porta Energy Metering ModBus Serial modBusMaster1Serial(P2_0,P2_1); //Recurso serial para porta Energy Metering ModBus /* //Interrupções externas e botões InterruptIn int_wh(P2_11); InterruptIn int_varh(P2_12); void whCount(void){ whled=1; wait(0.2); whled=0; } void varhCount(void){ varhled=1; wait(0.2); varhled=0; }*/ //Definições de Hardware acessÃveis em qualquer modulo /* void loadStandardConfig(){ strcpy(flashConfig.apnList[0],"claro.com.br"); strcpy(flashConfig.apnList[1],"zap.vivo.com.br"); strcpy(flashConfig.apnList[2],"tim.br"); strcpy(flashConfig.apnList[3],"generica.oi.com.br"); strcpy(flashConfig.login[0],"claro"); strcpy(flashConfig.login[1],"vivo"); strcpy(flashConfig.login[2],"tim"); strcpy(flashConfig.login[3],"oi"); strcpy(flashConfig.senha[0],"claro"); strcpy(flashConfig.senha[1],"vivo"); strcpy(flashConfig.senha[2],"tim"); strcpy(flashConfig.senha[3],"oi"); strcpy(flashConfig.serverAddress,"www.vitaesolucoes.com.br"); strcpy(flashConfig.serverPort,"80"); flashConfig.periodoDeEnvioDeDadosMinutos=15; //Padrão 15 minutos flashConfig.ultimoEstadoLigadoDesligado=0; //Padrão de fábrica desligado } */ void leiturasDigitais(){ entradasDigitais[0] = ED1; entradasDigitais[1] = ED2; entradasDigitais[2] = ED3; entradasDigitais[3] = ED4; entradasDigitais[4] = ED5; entradasDigitais[5] = ED6; entradasDigitais[6] = ED7; entradasDigitais[7] = ED8; entradasDigitais[8] = ED9; } /* AnalogIn ai4(p20); AnalogIn ai3(p19); AnalogIn ai2(p18); AnalogIn ai1(p17); AnalogIn ai4(P1_31); AnalogIn ai3(P1_30); AnalogIn ai2(P0_26); AnalogIn ai1(P0_25); */ HighSpeedAnalogIn analogInObject(P1_31,P1_30,P0_26,P0_25); void leiturasAnalogicas(){ float ai1_filtrado=0.0; float ai2_filtrado=0.0; float ai3_filtrado=0.0; float ai4_filtrado=0.0; uint8_t i; //LPC_SC->PCONP |= (1 << 12); //Set the PDADC bit residing in the 12th bit of the PCONP register for(i=0;i<5;i++){ ai1_filtrado += analogInObject.read_u16(P0_25); ai2_filtrado += analogInObject.read_u16(P0_26); ai3_filtrado += analogInObject.read_u16(P1_30); ai4_filtrado += analogInObject.read_u16(P1_31); } ai1_filtrado = ai1_filtrado/5; ai2_filtrado = ai2_filtrado/5; ai3_filtrado = ai3_filtrado/5; ai4_filtrado = ai4_filtrado/5; aiFiltrada[3] = ai4_filtrado; aiFiltrada[2] = ai3_filtrado; aiFiltrada[1] = ai2_filtrado; aiFiltrada[0] = ai1_filtrado; /*aiFiltrada[3] = FiltroAI4.get((uint16_t)floor(ai4_double)); aiFiltrada[2] = FiltroAI3.get((uint16_t)floor(ai3_double)); aiFiltrada[1] = FiltroAI2.get((uint16_t)floor(ai2_double)); aiFiltrada[0] = FiltroAI1.get((uint16_t)floor(ai1_double));*/ } //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. osThreadId idThreadTimers; void threadTimers(void const *args){ while(true){ osSignalWait(0x1,1000); //Executo compulsoriamente mesmo que não haja sinal num periodo de 1 segundo if(serialPC::startTimer_pacote){ serialPC::startTimer_pacote = false; osTimerStart(serialPC::timer_pacote,250); } if(serialModem::startTimer_pacote){ serialModem::startTimer_pacote = false; osTimerStart(serialModem::timer_pacote,modemCom::timeOutModem); } if(modBusMaster1::startThreadModBusMaster){ modBusMaster1::startThreadModBusMaster = false; osTimerStart(modBusMaster1::timer_pacote,4); } } } osThreadDef(threadTimers, osPriorityNormal, DEFAULT_STACK_SIZE/10); osThreadId idThreadProcessaPacote; void threadProcessaPacote(void const *args){ while(true){ osSignalWait(0x1,osWaitForever); //Executo apenas ao receber o sinal modemCom::processaPacote(NULL); } } osThreadDef(threadProcessaPacote, osPriorityNormal, DEFAULT_STACK_SIZE); //Thread que gerencia as comunicacoes (RAD - SERVER) osThreadId idThreadComunicacoes; void threadComunicacoes(void const *args){ //Esta thread faz todo o tratamento de comunicação. char aux[30]; while(true){ osSignalWait(0x1,1000); //Executo compulsoriamente mesmo que não haja sinal num periodo de 1 segundo if(hardwareReset){ //Resetando diversos::wdt.kick(0.1); while(true); } //if((modemCom::status.SRING)&&(!modemCom::status.serverConnected)){ if(modemCom::status.SRINGsockEntrante){ modemCom::status.SRINGsockEntrante=false; modemCom::atendeSRING(connID); } if(eventosRTC::rotina10Segundos){ //Verifica se IP mudou e se estou conectado!; //Verifica se esta conectado; /* if(!modemCom::sendToModem("at#sgact?\r",1,&modemCom::status.associated,500,2)){ //Não conectado reportar ao server uma vez que uma nova conexão irá mudar o IP reportaMudancaAoServer = true; } */ eventosRTC::rotina10Segundos = false; } if(eventosRTC::rotina1hora){ //Faço aqui o que for devido. pc.printf("Enviando dados de hora completa ao server.\n"); modemCom::status.emComunicacao = true; diversos::wdt.kick(300.0); modemCom::enviaDados(dadosArmazenados); diversos::wdt.kick(90.0); modemCom::status.emComunicacao = false; eventosRTC::rotina1hora = false; } if(sdCard::deleteSentFiles){ sdCard::deleteSentFiles = false; sdCard::finalizaEnvio(); } if(arquivoEnvioPointer!=NULL){ pc.printf("Enviando o arquivo <%s> ao server.\n",arquivoEnvioPointer->nome); if(modemCom::postFileCommandMode("www.vitaesolucoes.com.br","/drome/parser/index.php",arquivoEnvioPointer)){ pc.printf("Enviado o arquivo <%s>.\n",arquivoEnvioPointer->nome); arquivoEnvioPointer = NULL; }else{ pc.printf("Erro enviando o arquivo <%s>.\n",arquivoEnvioPointer->nome); } } led4=!led4; modemCom::timeOutModem = 30; //Reseto o watchdogTimer; diversos::wdt.kick(); } } osThreadDef(threadComunicacoes, osPriorityNormal, (DEFAULT_STACK_SIZE * 2)); void RTC_POR_SEGUNDO(void){ time_t seconds; seconds = time(NULL); eventosRTC::rotina1segundo=true; if((seconds%10)==0){ eventosRTC::rotina10Segundos = true; osSignalSet(idThreadComunicacoes, 0x1); } if((seconds%60)==0){ eventosRTC::minutos = true; } //if((seconds%900)==0){ if((seconds%900)==0){ eventosRTC::rotina15Minutos = true; } if((seconds%3600)==0){ //Atuando a cada 3 minutos //Entro aqui a cada hora eventosRTC::rotina1hora = true; } } //Timeout timeOutModem; void chamaProcessaPacotePeloTimeOut(){ modemCom::processaPacote(NULL); } void loadDevices(){ if(sdCard::abreArquivo(&sdCard::devices,"r")){ criaDevices(sdCard::devices.fp); if(devices){ configuraDevices(sdCard::devices.fp); printf("Dispositivos configurados.\n"); testaTudoDevices(); } sdCard::fechaArquivo(&sdCard::devices); } } void inicializaMaquina(){ pwmPeriod = 100000; SD1.period_us(pwmPeriod); modemCom::atendendoWebServer = false; serialPC::serialPC_init(); pc.printf("Versao 07/02/2016.\r\n"); modemCom::timeOutModem = 30; serialModem::serial_init(); numeroDeBytesPorEnvio = 768; //loadStandardConfig(); //Carregando standardConfig //DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG modBusMaster1::modBusMaster(&modBusMaster1Serial,19200,&max_de); /* //Interrupções externas e botões int_wh.mode(PullNone); int_varh.mode(PullNone); int_wh.fall(&whCount); int_varh.fall(&varhCount);*/ //DEBUG pc.printf("Inicializando DROME.\n"); //Debug debug debug debug debug debug debug debug debug debug debug debug if(sdCard::init()){ pc.printf("SD Card inicializado com sucesso.\n"); //Carregando a lista de dispositivos loadDevices(); }else{ pc.printf("Nao foi possivel inicializar o SD Card.\n"); } //Timers por minuto RTC::attach(&RTC_POR_SEGUNDO, RTC::Second); //Chamada de threads //Thread dos timers! idThreadTimers = osThreadCreate(osThread(threadTimers), NULL); //Thread das comunicacoes idThreadComunicacoes = osThreadCreate(osThread(threadComunicacoes), NULL); //Thread da funcao processaPacote idThreadProcessaPacote = osThreadCreate(osThread(threadProcessaPacote), NULL); //Chamada de threads serialModem::configBaud(); } void verificaSaidasDigitais(){ SD_OE_R = 1; } Serial modem(P0_10,P0_11); //Instancia de recurso Serial uart Modem //Inicio do programa; int main() { //Inicializando maquina /*uint16_t leInicioESP=150000; while(leInicioESP){ if(modem.readable()){ char r = modem.getc(); pc.putc(r); } wait(0.0001); leInicioESP--; }*/ diversos::wdt.kick(90.0); modem.baud(76800); ESP_CH_PD = 1; ESP_ESPGPIO_2 = 1; ESP_RESET = 1; reportaMudancaAoServer = true; modemCom::status.emComunicacao=false; wait(5); inicializaMaquina(); modemCom::inicializaModem(); modemCom::conectaWiFi(); wait(2); modemCom::enviaDados(dadosStatus); while(true){ if(eventosRTC::rotina1segundo){ eventosRTC::rotina1segundo = false; if(enviaDadosPorAlarme!=255){ enviaDadosPorAlarme--; if(enviaDadosPorAlarme==0){ eventosRTC::rotina1hora=true; enviaDadosPorAlarme=255; } } //pc.printf("Passo 1.\r\n"); leiturasAnalogicas(); //pc.printf("Passo 2.\r\n"); leiturasDigitais(); //pc.printf("Passo 3.\r\n"); verifyAlarms(); //pc.printf("Passo 4.\r\n"); verificaSaidasDigitais(); pc.printf("\nMemoria RAM disponivel = %lu\n",diversos::memAvailable()); time_t seconds = time(NULL); printf("%s\n", ctime(&seconds)); //pc.printf("\nEntrada 3 = %lu.\nEntrada 2 = %lu.\nEntrada 1 = %lu.\n\n",aiFiltrada[2],aiFiltrada[1],aiFiltrada[0]); //Debug teste de saidas digitais. /* DigitalIn SD_FAULT(P1_9); DigitalOut SD_OE_R(P1_10); DigitalOut SD1(P1_18); DigitalOut SD2(P1_20); */ /*if(SD_FAULT){ printf("Estado de SD_FAULT = 1.\r\n"); }else{printf("Estado de SD_FAULT = 0.\r\n");} SD_OE_R = 1; SD1.period(0.001); SD2.period(0.0001); SD1.write(1); for(int cont = 0; cont<11; cont++){ SD2.write((float)cont/10); wait(0.5); printf("Intensidade = %f.\r\n",(float)(cont/10)); }*/ } if(eventosRTC::rotina10Segundos){ //Executo abaixo a rotina de 10 segundos verifySchedules(); eventosRTC::rotina10Segundos = false; } if(eventosRTC::minutos){ //Executo abaixo a rotina de 1 minuto writeReadingsToSD(); eventosRTC::minutos = false; } if(executaComandoServer){ executaComandoServer = false; commands::exec(connID); } if(modemCom::atendendoWebServer){ modemCom::atendendoWebServer = false; pc.printf("Atendendo webServer.\r\n"); modemCom::webServer(); } /* if(enviaSendData){ enviaSendData = false; modemCom::sendBufferCommandMode(connID,"sendData\r\n",10); } */ /*if(eventosRTC::rotina1hora){ osDelay(1000); //Para dar tempo de a threadComunicações ver que tinha uma rotina de 1 hora agendada. eventosRTC::rotina1hora = false; //Executo abaixo a rotina de 1 hora }*/ } }