![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Versão do protegemed que calcula o tempo em ms da fuga, calcula o numero de onverflow (valores muito baixo) e underflow (valores muito altos). Além disso, calcula um valor médio a partir dos valores capturados e não apenas pela fft.
Dependencies: EthernetInterface mbed-rtos mbed
Diff: Codes/EventDetector.cpp
- Revision:
- 0:c64e1194230b
- Child:
- 1:917ca6b5d9d9
diff -r 000000000000 -r c64e1194230b Codes/EventDetector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Codes/EventDetector.cpp Wed Jul 09 21:16:23 2014 +0000 @@ -0,0 +1,282 @@ +/* + * EventDetector.cpp + * + * Created on: + * Author: + */ + + #include "EventDetector.h" + #include "CommTCP.h" + + #define MARCA 10 + #define UMCICLO 16.666666667 + +CaptureMailbox EventDetector::m_EventMailbox; +EventDetector EventDetector::m_Detector[NUMBER_OF_CHANNELS] = {0,1,2,3,4,5}; +static int cont=0; +static int contliga=0; +static int contdesl=0; + +CaptureEvent::CaptureEvent() +{ +} + +//void CaptureEvent::Setup(char* rfid,int type,int outlet,float mv,float rms,float gain, int offset,float* sin, float* cos) +void CaptureEvent::Setup(char* rfid, int type, int outlet, float mv, float mv2, float rms, int under, int over, float gain, int offset, int duration, float* sin, float* cos) +{ + memcpy(m_RFID,rfid,9); + m_Type = type; + m_OutletNumber = outlet; + m_MeanValue = mv; + m_MV2 = mv2; + m_RMSValue = rms; + m_Under = under; + m_Over = over; + m_Gain = gain; + m_Offset = offset; + m_Duration = duration; + 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) +void EventDetector::ProcessEvent(float rmsvalue, float mv2, int under, int over) +{ + short gerafuga = 0; + int tempofuga = 0; + + //Thread::wait(500);//TimeDelay(t)); + //printf("%d time delay\n", TimeDelay(t)); + if (gerafuga && (m_Channel % 2 == 0) ){ + /* + if (cont % MARCA == 0) + printf("Envia Fuga %d %d\n", cont, TimeDelay(m_Channel)); + cont++; + */ + // Fuga + m_OutletTriggered = true; + Capture::Stop(); + //printf("Passou Stop\n"); + //CommTCP::RequestAcom(); + OnTrigger(rmsvalue, mv2, under, over, 0); //TODO: must change the parameter of this function call + //printf("Passou OnTriger\n"); + Capture::Start(); + //printf("Passou Start\n"); + m_EventCounter = 0; + + Thread::wait(2); + // Termino + /* + if (cont % MARCA == 0) + printf("Envia Termino\n"); + */ + m_OutletTriggered = false; + Capture::Stop(); + //printf("Passou Stop\n"); + OnTrigger(rmsvalue, mv2, under, over, 0);//TODO: must change the parameter of this function call + //printf("Passou onTrigger\n"); + Capture::Start(); + //printf("Passou Start\n"); + m_EventCounter = 0; + + Thread::wait(2); + } + else{ + if(rmsvalue > Settings::get_Limit(m_Channel)) + { + if(!m_OutletTriggered) + { + if(m_EventCounter < Settings::get_EventLimit()) + { + m_EventCounter++; + } + else + { + //printf("Deu evento de liga ou Fuga\n"); + if (m_Channel % 2 == 1) // Canais impares sao de diferencial + m_tempo.start(); + m_OutletTriggered = true; + Capture::Stop(); + OnTrigger(rmsvalue, mv2, under, over, 0); //TODO: must change the parameter of this function call + //CommTCP::RequestAcom(); + //zzz + Capture::Start(); + m_EventCounter = 0; + } + } + else + m_EventCounter = 0; + } + else + { + if(m_OutletTriggered) + { + if(m_EventCounter < Settings::get_EventLimit()) + { + m_EventCounter++; + } + else + { + //printf("Terminou evento de liga ou Fuga\n"); + if (m_Channel % 2 == 1){ // Canais impares sao de diferencial + //m_tempo.stop(); + tempofuga = (int) (Settings::get_EventLimit() * UMCICLO) + m_tempo.read_ms(); + //printf("Limite %d\n", (int) (Settings::get_EventLimit() * UMCICLO)); + m_tempo.reset(); + } + else + tempofuga = 0; + m_OutletTriggered = false; + Capture::Stop(); + OnTrigger(rmsvalue, mv2, under, over, tempofuga);//TODO: must change the parameter of this function call + //printf("===> contliga %d contdesliga %d\n", contliga, contdesl); + //zzz + 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("MV2: %f\n", e->get_MV2()); + printf("RMSValue: %f\n", e->get_RMSValue()); + printf("Underflow: %d\n", e->get_Under()); + printf("Overflow: %d\n", e->get_Over()); + printf("Gain: %f\n", e->get_Gain()); + printf("Offset: %d\n", e->get_Offset()); + printf("Duration: %d\n", e->get_Duration()); + + 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) +void EventDetector::OnTrigger(float rmsvalue, float mv2, int under, int over, int duration) +{ + SendMessage(0,rmsvalue, mv2, under, over, duration); + //printf("Ontrigger::Enviou mensagem\n"); + /* + if(m_OutletTriggered) + { + for(int i=0;i<Settings::get_MaxChannels();i++) + { + //Thread::wait(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() +{ + // Ajustar valores de mv2, under, over e duration na chamada!!! + SendMessage(1, 0, 0, 0, 0, 0); +} + +//void EventDetector::SendMessage(int ext,float rmsvalue) +void EventDetector::SendMessage(int ext, float rmsvalue, float mv2, int under, int over, int duration) +{ + //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+1],coss[NUMBER_OF_HARMONICS+1],mv; + //SignalProcessor::CalculateFFT(buf,sen,cos,&mv,1); + + int type=0,outlet_number=0, aux=0; + aux = Settings::get_OutletNumber(m_Channel); + outlet_number = Settings::get_Outlet(aux); + //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, m_Channel); + /* + 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); + + event->Setup(rfid,type,outlet_number,mv,mv2, rmsvalue,under, over, Settings::get_Gain(m_Channel),Settings::get_Offset(m_Channel),duration, seno,coss); + + //printf("\n\nDuration: %d\n\n", duration); + //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; + } +}