teste de publish
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
Diff: main.cpp
- Revision:
- 0:1c0a769988ee
- Child:
- 1:0e0967c88590
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Mar 24 15:54:41 2017 +0000 @@ -0,0 +1,491 @@ +#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 + }*/ + } +}