Marcelo Rebonatto / Mbed 2 deprecated PM_COPIA

Dependencies:   EthernetInterface mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers EventDetector.cpp Source File

EventDetector.cpp

00001 /*
00002  * EventDetector.cpp
00003  *
00004  *  Created on: 
00005  *      Author: 
00006  */
00007  
00008  #include "EventDetector.h"
00009  #include "CommTCP.h"
00010  
00011  #define MARCA 10
00012 
00013 CaptureMailbox EventDetector::m_EventMailbox;
00014 EventDetector EventDetector::m_Detector[NUMBER_OF_CHANNELS] = {0,1,2,3,4,5};
00015 static int cont=0;
00016 
00017 CaptureEvent::CaptureEvent()
00018 {
00019 }
00020 
00021 void CaptureEvent::Setup(char* rfid,int type,int outlet,float mv,float rms,float gain, int offset,float* sin, float* cos)
00022 {
00023     memcpy(m_RFID,rfid,9);
00024     m_Type = type;
00025     m_OutletNumber = outlet;
00026     m_MeanValue = mv;
00027     m_RMSValue = rms;
00028     m_Gain = gain;
00029     m_Offset = offset;
00030     memcpy(m_Sin,sin,Settings::get_MaxHarmonics()*sizeof(float));
00031     memcpy(m_Cos,cos,Settings::get_MaxHarmonics()*sizeof(float));
00032 }
00033 
00034 EventDetector::EventDetector(int ch)
00035 {
00036     m_Channel = ch;
00037     m_OutletTriggered = false;
00038     m_EventCounter = 0;
00039 }
00040     
00041     
00042 void EventDetector::ProcessEvent(float rmsvalue, int t)
00043 {
00044     int gerafuga = 0;
00045     
00046     //wait_ms(500);//TimeDelay(t));
00047     //printf("%d time delay\n", TimeDelay(t));
00048     if (gerafuga && (t % 2 == 0) ){            
00049             if (cont % MARCA == 0)
00050                 printf("Envia Fuga %d %d\n", cont, TimeDelay(t));
00051             cont++;
00052     // Fuga
00053                 m_OutletTriggered = true;  
00054                 Capture::Stop();              
00055                 //printf("Passou Stop\n");
00056                 //CommTCP::RequestAcom();
00057                 OnTrigger(rmsvalue);       //TODO: must change the parameter of this function call
00058                 //printf("Passou OnTriger\n");
00059                 Capture::Start();
00060                 //printf("Passou Start\n");
00061                 m_EventCounter = 0;
00062 
00063     wait_ms(2);
00064     // Termino
00065             if (cont % MARCA == 0)
00066                 printf("Envia Termino\n");
00067                 m_OutletTriggered = false;
00068                 Capture::Stop();
00069                 //printf("Passou Stop\n");
00070                 OnTrigger(rmsvalue);//TODO: must change the parameter of this function call
00071                 //printf("Passou onTrigger\n");
00072                 Capture::Start();
00073                 //printf("Passou Start\n");
00074                 m_EventCounter = 0;
00075                 
00076     wait_ms(2);
00077     }
00078     else{
00079     
00080     if(rmsvalue > Settings::get_Limit(m_Channel))
00081     {
00082         if(!m_OutletTriggered)
00083         {
00084             if(m_EventCounter < Settings::get_EventLimit())
00085             {
00086                 m_EventCounter++;
00087             }
00088             else
00089             {
00090                 //printf("Deu Fuga\n");
00091                 m_OutletTriggered = true;  
00092                 Capture::Stop();              
00093                 OnTrigger(rmsvalue); //TODO: must change the parameter of this function call
00094                 //CommTCP::RequestAcom();
00095                 Capture::Start();
00096                 m_EventCounter = 0;
00097             }
00098         }
00099         else
00100             m_EventCounter = 0;
00101     }
00102     else
00103     {
00104         if(m_OutletTriggered)
00105         {
00106             if(m_EventCounter < Settings::get_EventLimit())
00107                 m_EventCounter++;
00108             else
00109             {
00110                 m_OutletTriggered = false;
00111                 Capture::Stop();
00112                 OnTrigger(rmsvalue);//TODO: must change the parameter of this function call
00113                 Capture::Start();
00114                 m_EventCounter = 0;
00115             }
00116         }
00117         else
00118             m_EventCounter = 0;
00119     }
00120     } // Final gerafuga
00121 }
00122             
00123 void EventDetector::ShowValues(CaptureEvent* e)
00124 {        
00125     printf("RFID: %s\n", e->get_RFID());
00126     printf("type: %d\n", e->get_Type());    
00127     printf("OutletNr: %d\n", e->get_OutletNumber());
00128     printf("MeanValue: %f\n", e->get_MeanValue());
00129     printf("RMSValue: %f\n", e->get_RMSValue());
00130     printf("Gain: %f\n", e->get_Gain());
00131     printf("Offset: %d\n", e->get_Offset());
00132     
00133     int i;
00134     for(i=0;i<12;i++)
00135     {
00136         printf("Harm %d Sen %f Cos %f\n ", i, e->get_SineValue(i), e->get_CossineValue(i));
00137     }
00138 }
00139 
00140 void EventDetector::OnTrigger(float rmsvalue)
00141 {
00142     SendMessage(0,rmsvalue);
00143     //printf("Ontrigger::Enviou mensagem\n");
00144     /*
00145     if(m_OutletTriggered)
00146     {
00147         for(int i=0;i<Settings::get_MaxChannels();i++)
00148         {
00149             //wait_ms(300);
00150             if(i != m_Channel){
00151                 //printf("Ontrigger::Enviou acompanhamento %d\n", i);
00152                 get_Detector(i).ExternalTrigger();
00153             }
00154         }
00155         //printf("Ontrigger::Enviou acompanhamentos %d\n");
00156     }
00157     */
00158 }
00159 
00160 void EventDetector::ExternalTrigger()
00161 {
00162     SendMessage(1,0);
00163 }
00164 
00165 void EventDetector::SendMessage(int ext,float rmsvalue)
00166 {   
00167     
00168     //Here we must alloc a CaptureEvent object from mailbox pool,
00169     CaptureEvent* event = GetMailbox().alloc();
00170     //printf("Capturou evento\n");
00171     //then initialize the object properly
00172     
00173     unsigned short int buf[NUMBER_OF_SAMPLES];
00174     Capture::CopyBuffer(m_Channel,buf);
00175     
00176     if(ext)
00177     {
00178         rmsvalue = 0;//SignalProcessor::CalculateRMS(buf,m_Channel);
00179     }
00180     
00181     float seno[NUMBER_OF_HARMONICS],coss[NUMBER_OF_HARMONICS],mv;
00182     //SignalProcessor::CalculateFFT(buf,sen,cos,&mv,1);
00183         
00184     int type=0,outlet_number=0;
00185     outlet_number = Settings::get_OutletNumber(m_Channel);
00186     outlet_number = Settings::get_Outlet(outlet_number);
00187     //Temporario
00188     char rfid[9] = "1234560";
00189     rfid[7] = (char)outlet_number + '0';
00190     
00191     if(Settings::get_Purpose(m_Channel) == 'p') // phase channel 
00192     {
00193         if(ext!=0)
00194             type = 3;
00195         else
00196         {
00197             if(m_OutletTriggered)
00198                 type = 4;                           // power on event
00199             else
00200                 type = 5;                           // power off event
00201         }
00202     }
00203     if(Settings::get_Purpose(m_Channel) == 'd') // diferential channel (leakage)
00204     {
00205         if(ext!=0)
00206             type = 2;
00207         else
00208         {
00209             if(m_OutletTriggered)
00210                 type = 1;                           // start leakage event
00211             else
00212                 type = 6;                           // stop leakage event
00213         }
00214     }
00215     
00216     if (type == 1 || type == 2 || type == 4) // Calula FFT s nos eventos de fuga, acompanhamento de fuga (diferencial) e liga
00217         SignalProcessor::CalculateFFT(buf,seno,coss,&mv,1);
00218         /*
00219         for(int y=0; y < 12; y++)
00220             printf("[%d] sen %f cos %f\n", y, seno[y], coss[y]);
00221         */
00222     else
00223         for(int i=0; i < Settings::get_MaxHarmonics(); i++)
00224             seno[i] = coss[i] = 0; 
00225             
00226     event->Setup(rfid,type,outlet_number,mv,rmsvalue,Settings::get_Gain(m_Channel),Settings::get_Offset(m_Channel),seno,coss);
00227     
00228     //ShowValues(event);       
00229            
00230     //and finally place the object in the mailbox queue.
00231     GetMailbox().put(event);
00232     //printf("Deu put no evento no mailBox\n");
00233 }
00234 
00235 int EventDetector::TimeDelay(int t){    
00236     switch (t){
00237         case 0: return 300;
00238         case 1: return 250;
00239         case 2: return 200;
00240         case 3: return 250;
00241         case 4: return 200;
00242         default: return 150; 
00243     }
00244 }