Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface mbed-rtos mbed
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 }
Generated on Fri Jul 15 2022 22:11:24 by
1.7.2