Versão atual 13-12-2013.
Dependencies: EthernetInterface mbed-rtos mbed
Diff: Codes/EventDetector.cpp
- Revision:
- 0:65c41a68b49a
diff -r 000000000000 -r 65c41a68b49a Codes/EventDetector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Codes/EventDetector.cpp Fri Dec 13 11:42:59 2013 +0000 @@ -0,0 +1,244 @@ +/* + * 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; + } +}