![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Versão atual 13-12-2013.
Dependencies: EthernetInterface mbed-rtos mbed
Codes/EventDetector.cpp
- Committer:
- rebonatto
- Date:
- 2013-12-13
- Revision:
- 0:65c41a68b49a
File content as of revision 0:65c41a68b49a:
/* * EventDetector.cpp * * Created on: * Author: */ #include "EventDetector.h" #include "CommTCP.h" #define MARCA 10 CaptureMailbox EventDetector::m_EventMailbox; EventDetector EventDetector::m_Detector[NUMBER_OF_CHANNELS] = {0,1,2,3,4,5}; static int cont=0; CaptureEvent::CaptureEvent() { } void CaptureEvent::Setup(char* rfid,int type,int outlet,float mv,float rms,float gain, int offset,float* sin, float* cos) { memcpy(m_RFID,rfid,9); m_Type = type; m_OutletNumber = outlet; m_MeanValue = mv; m_RMSValue = rms; m_Gain = gain; m_Offset = offset; memcpy(m_Sin,sin,Settings::get_MaxHarmonics()*sizeof(float)); memcpy(m_Cos,cos,Settings::get_MaxHarmonics()*sizeof(float)); } EventDetector::EventDetector(int ch) { m_Channel = ch; m_OutletTriggered = false; m_EventCounter = 0; } void EventDetector::ProcessEvent(float rmsvalue, int t) { int gerafuga = 0; //wait_ms(500);//TimeDelay(t)); //printf("%d time delay\n", TimeDelay(t)); if (gerafuga && (t % 2 == 0) ){ if (cont % MARCA == 0) printf("Envia Fuga %d %d\n", cont, TimeDelay(t)); cont++; // Fuga m_OutletTriggered = true; Capture::Stop(); //printf("Passou Stop\n"); //CommTCP::RequestAcom(); OnTrigger(rmsvalue); //TODO: must change the parameter of this function call //printf("Passou OnTriger\n"); Capture::Start(); //printf("Passou Start\n"); m_EventCounter = 0; wait_ms(2); // Termino if (cont % MARCA == 0) printf("Envia Termino\n"); m_OutletTriggered = false; Capture::Stop(); //printf("Passou Stop\n"); OnTrigger(rmsvalue);//TODO: must change the parameter of this function call //printf("Passou onTrigger\n"); Capture::Start(); //printf("Passou Start\n"); m_EventCounter = 0; wait_ms(2); } else{ if(rmsvalue > Settings::get_Limit(m_Channel)) { if(!m_OutletTriggered) { if(m_EventCounter < Settings::get_EventLimit()) { m_EventCounter++; } else { //printf("Deu Fuga\n"); m_OutletTriggered = true; Capture::Stop(); OnTrigger(rmsvalue); //TODO: must change the parameter of this function call //CommTCP::RequestAcom(); Capture::Start(); m_EventCounter = 0; } } else m_EventCounter = 0; } else { if(m_OutletTriggered) { if(m_EventCounter < Settings::get_EventLimit()) m_EventCounter++; else { m_OutletTriggered = false; Capture::Stop(); OnTrigger(rmsvalue);//TODO: must change the parameter of this function call Capture::Start(); m_EventCounter = 0; } } else m_EventCounter = 0; } } // Final gerafuga } void EventDetector::ShowValues(CaptureEvent* e) { printf("RFID: %s\n", e->get_RFID()); printf("type: %d\n", e->get_Type()); printf("OutletNr: %d\n", e->get_OutletNumber()); printf("MeanValue: %f\n", e->get_MeanValue()); printf("RMSValue: %f\n", e->get_RMSValue()); printf("Gain: %f\n", e->get_Gain()); printf("Offset: %d\n", e->get_Offset()); int i; for(i=0;i<12;i++) { printf("Harm %d Sen %f Cos %f\n ", i, e->get_SineValue(i), e->get_CossineValue(i)); } } void EventDetector::OnTrigger(float rmsvalue) { SendMessage(0,rmsvalue); //printf("Ontrigger::Enviou mensagem\n"); /* if(m_OutletTriggered) { for(int i=0;i<Settings::get_MaxChannels();i++) { //wait_ms(300); if(i != m_Channel){ //printf("Ontrigger::Enviou acompanhamento %d\n", i); get_Detector(i).ExternalTrigger(); } } //printf("Ontrigger::Enviou acompanhamentos %d\n"); } */ } void EventDetector::ExternalTrigger() { SendMessage(1,0); } void EventDetector::SendMessage(int ext,float rmsvalue) { //Here we must alloc a CaptureEvent object from mailbox pool, CaptureEvent* event = GetMailbox().alloc(); //printf("Capturou evento\n"); //then initialize the object properly unsigned short int buf[NUMBER_OF_SAMPLES]; Capture::CopyBuffer(m_Channel,buf); if(ext) { rmsvalue = 0;//SignalProcessor::CalculateRMS(buf,m_Channel); } float seno[NUMBER_OF_HARMONICS],coss[NUMBER_OF_HARMONICS],mv; //SignalProcessor::CalculateFFT(buf,sen,cos,&mv,1); int type=0,outlet_number=0; outlet_number = Settings::get_OutletNumber(m_Channel); outlet_number = Settings::get_Outlet(outlet_number); //Temporario char rfid[9] = "1234560"; rfid[7] = (char)outlet_number + '0'; if(Settings::get_Purpose(m_Channel) == 'p') // phase channel { if(ext!=0) type = 3; else { if(m_OutletTriggered) type = 4; // power on event else type = 5; // power off event } } if(Settings::get_Purpose(m_Channel) == 'd') // diferential channel (leakage) { if(ext!=0) type = 2; else { if(m_OutletTriggered) type = 1; // start leakage event else type = 6; // stop leakage event } } if (type == 1 || type == 2 || type == 4) // Calula FFT s nos eventos de fuga, acompanhamento de fuga (diferencial) e liga SignalProcessor::CalculateFFT(buf,seno,coss,&mv,1); /* for(int y=0; y < 12; y++) printf("[%d] sen %f cos %f\n", y, seno[y], coss[y]); */ else for(int i=0; i < Settings::get_MaxHarmonics(); i++) seno[i] = coss[i] = 0; event->Setup(rfid,type,outlet_number,mv,rmsvalue,Settings::get_Gain(m_Channel),Settings::get_Offset(m_Channel),seno,coss); //ShowValues(event); //and finally place the object in the mailbox queue. GetMailbox().put(event); //printf("Deu put no evento no mailBox\n"); } int EventDetector::TimeDelay(int t){ switch (t){ case 0: return 300; case 1: return 250; case 2: return 200; case 3: return 250; case 4: return 200; default: return 150; } }