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

Committer:
rebonatto
Date:
Fri Jul 18 20:24:45 2014 +0000
Revision:
1:917ca6b5d9d9
Parent:
0:c64e1194230b
Child:
2:86c3cb25577b
Nova vers?o: problemas com excesso de mem?ria.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rebonatto 0:c64e1194230b 1 /*
rebonatto 0:c64e1194230b 2 * EventDetector.cpp
rebonatto 0:c64e1194230b 3 *
rebonatto 0:c64e1194230b 4 * Created on:
rebonatto 0:c64e1194230b 5 * Author:
rebonatto 0:c64e1194230b 6 */
rebonatto 0:c64e1194230b 7
rebonatto 0:c64e1194230b 8 #include "EventDetector.h"
rebonatto 0:c64e1194230b 9 #include "CommTCP.h"
rebonatto 0:c64e1194230b 10
rebonatto 0:c64e1194230b 11 #define MARCA 10
rebonatto 0:c64e1194230b 12 #define UMCICLO 16.666666667
rebonatto 0:c64e1194230b 13
rebonatto 0:c64e1194230b 14 CaptureMailbox EventDetector::m_EventMailbox;
rebonatto 0:c64e1194230b 15 EventDetector EventDetector::m_Detector[NUMBER_OF_CHANNELS] = {0,1,2,3,4,5};
rebonatto 0:c64e1194230b 16 static int cont=0;
rebonatto 0:c64e1194230b 17 static int contliga=0;
rebonatto 0:c64e1194230b 18 static int contdesl=0;
rebonatto 0:c64e1194230b 19
rebonatto 0:c64e1194230b 20 CaptureEvent::CaptureEvent()
rebonatto 0:c64e1194230b 21 {
rebonatto 0:c64e1194230b 22 }
rebonatto 0:c64e1194230b 23
rebonatto 0:c64e1194230b 24 //void CaptureEvent::Setup(char* rfid,int type,int outlet,float mv,float rms,float gain, int offset,float* sin, float* cos)
rebonatto 0:c64e1194230b 25 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)
rebonatto 0:c64e1194230b 26 {
rebonatto 0:c64e1194230b 27 memcpy(m_RFID,rfid,9);
rebonatto 0:c64e1194230b 28 m_Type = type;
rebonatto 0:c64e1194230b 29 m_OutletNumber = outlet;
rebonatto 0:c64e1194230b 30 m_MeanValue = mv;
rebonatto 0:c64e1194230b 31 m_MV2 = mv2;
rebonatto 0:c64e1194230b 32 m_RMSValue = rms;
rebonatto 0:c64e1194230b 33 m_Under = under;
rebonatto 0:c64e1194230b 34 m_Over = over;
rebonatto 0:c64e1194230b 35 m_Gain = gain;
rebonatto 0:c64e1194230b 36 m_Offset = offset;
rebonatto 0:c64e1194230b 37 m_Duration = duration;
rebonatto 0:c64e1194230b 38 memcpy(m_Sin,sin,Settings::get_MaxHarmonics()*sizeof(float));
rebonatto 0:c64e1194230b 39 memcpy(m_Cos,cos,Settings::get_MaxHarmonics()*sizeof(float));
rebonatto 0:c64e1194230b 40 }
rebonatto 0:c64e1194230b 41
rebonatto 0:c64e1194230b 42 EventDetector::EventDetector(int ch)
rebonatto 0:c64e1194230b 43 {
rebonatto 0:c64e1194230b 44 m_Channel = ch;
rebonatto 0:c64e1194230b 45 m_OutletTriggered = false;
rebonatto 0:c64e1194230b 46 m_EventCounter = 0;
rebonatto 0:c64e1194230b 47 }
rebonatto 0:c64e1194230b 48
rebonatto 0:c64e1194230b 49 //void EventDetector::ProcessEvent(float rmsvalue, int t)
rebonatto 0:c64e1194230b 50 void EventDetector::ProcessEvent(float rmsvalue, float mv2, int under, int over)
rebonatto 0:c64e1194230b 51 {
rebonatto 0:c64e1194230b 52 short gerafuga = 0;
rebonatto 0:c64e1194230b 53 int tempofuga = 0;
rebonatto 0:c64e1194230b 54
rebonatto 0:c64e1194230b 55 //Thread::wait(500);//TimeDelay(t));
rebonatto 0:c64e1194230b 56 //printf("%d time delay\n", TimeDelay(t));
rebonatto 0:c64e1194230b 57 if (gerafuga && (m_Channel % 2 == 0) ){
rebonatto 0:c64e1194230b 58 /*
rebonatto 0:c64e1194230b 59 if (cont % MARCA == 0)
rebonatto 0:c64e1194230b 60 printf("Envia Fuga %d %d\n", cont, TimeDelay(m_Channel));
rebonatto 0:c64e1194230b 61 cont++;
rebonatto 0:c64e1194230b 62 */
rebonatto 0:c64e1194230b 63 // Fuga
rebonatto 0:c64e1194230b 64 m_OutletTriggered = true;
rebonatto 0:c64e1194230b 65 Capture::Stop();
rebonatto 0:c64e1194230b 66 //printf("Passou Stop\n");
rebonatto 0:c64e1194230b 67 //CommTCP::RequestAcom();
rebonatto 0:c64e1194230b 68 OnTrigger(rmsvalue, mv2, under, over, 0); //TODO: must change the parameter of this function call
rebonatto 0:c64e1194230b 69 //printf("Passou OnTriger\n");
rebonatto 0:c64e1194230b 70 Capture::Start();
rebonatto 0:c64e1194230b 71 //printf("Passou Start\n");
rebonatto 0:c64e1194230b 72 m_EventCounter = 0;
rebonatto 0:c64e1194230b 73
rebonatto 0:c64e1194230b 74 Thread::wait(2);
rebonatto 0:c64e1194230b 75 // Termino
rebonatto 0:c64e1194230b 76 /*
rebonatto 0:c64e1194230b 77 if (cont % MARCA == 0)
rebonatto 0:c64e1194230b 78 printf("Envia Termino\n");
rebonatto 0:c64e1194230b 79 */
rebonatto 0:c64e1194230b 80 m_OutletTriggered = false;
rebonatto 0:c64e1194230b 81 Capture::Stop();
rebonatto 0:c64e1194230b 82 //printf("Passou Stop\n");
rebonatto 0:c64e1194230b 83 OnTrigger(rmsvalue, mv2, under, over, 0);//TODO: must change the parameter of this function call
rebonatto 0:c64e1194230b 84 //printf("Passou onTrigger\n");
rebonatto 0:c64e1194230b 85 Capture::Start();
rebonatto 0:c64e1194230b 86 //printf("Passou Start\n");
rebonatto 0:c64e1194230b 87 m_EventCounter = 0;
rebonatto 0:c64e1194230b 88
rebonatto 0:c64e1194230b 89 Thread::wait(2);
rebonatto 0:c64e1194230b 90 }
rebonatto 1:917ca6b5d9d9 91 else{
rebonatto 1:917ca6b5d9d9 92 /*
rebonatto 1:917ca6b5d9d9 93 unsigned short int buf[NUMBER_OF_SAMPLES];
rebonatto 1:917ca6b5d9d9 94 Capture::CopyBuffer(m_Channel,buf);
rebonatto 1:917ca6b5d9d9 95 if ( (rmsvalue > 200) && (m_Channel == 0) ){
rebonatto 1:917ca6b5d9d9 96 for(int y=0; y< 256; y++)
rebonatto 1:917ca6b5d9d9 97 printf("%d*",buf
rebonatto 1:917ca6b5d9d9 98 [y]);
rebonatto 1:917ca6b5d9d9 99 printf("\n");
rebonatto 1:917ca6b5d9d9 100 }
rebonatto 1:917ca6b5d9d9 101 */
rebonatto 0:c64e1194230b 102 if(rmsvalue > Settings::get_Limit(m_Channel))
rebonatto 0:c64e1194230b 103 {
rebonatto 0:c64e1194230b 104 if(!m_OutletTriggered)
rebonatto 0:c64e1194230b 105 {
rebonatto 0:c64e1194230b 106 if(m_EventCounter < Settings::get_EventLimit())
rebonatto 0:c64e1194230b 107 {
rebonatto 0:c64e1194230b 108 m_EventCounter++;
rebonatto 0:c64e1194230b 109 }
rebonatto 0:c64e1194230b 110 else
rebonatto 0:c64e1194230b 111 {
rebonatto 0:c64e1194230b 112 //printf("Deu evento de liga ou Fuga\n");
rebonatto 0:c64e1194230b 113 if (m_Channel % 2 == 1) // Canais impares sao de diferencial
rebonatto 0:c64e1194230b 114 m_tempo.start();
rebonatto 0:c64e1194230b 115 m_OutletTriggered = true;
rebonatto 0:c64e1194230b 116 Capture::Stop();
rebonatto 0:c64e1194230b 117 OnTrigger(rmsvalue, mv2, under, over, 0); //TODO: must change the parameter of this function call
rebonatto 0:c64e1194230b 118 //CommTCP::RequestAcom();
rebonatto 0:c64e1194230b 119 //zzz
rebonatto 0:c64e1194230b 120 Capture::Start();
rebonatto 0:c64e1194230b 121 m_EventCounter = 0;
rebonatto 0:c64e1194230b 122 }
rebonatto 0:c64e1194230b 123 }
rebonatto 0:c64e1194230b 124 else
rebonatto 0:c64e1194230b 125 m_EventCounter = 0;
rebonatto 0:c64e1194230b 126 }
rebonatto 0:c64e1194230b 127 else
rebonatto 0:c64e1194230b 128 {
rebonatto 0:c64e1194230b 129 if(m_OutletTriggered)
rebonatto 0:c64e1194230b 130 {
rebonatto 0:c64e1194230b 131 if(m_EventCounter < Settings::get_EventLimit())
rebonatto 0:c64e1194230b 132 {
rebonatto 0:c64e1194230b 133 m_EventCounter++;
rebonatto 0:c64e1194230b 134 }
rebonatto 0:c64e1194230b 135 else
rebonatto 0:c64e1194230b 136 {
rebonatto 0:c64e1194230b 137 //printf("Terminou evento de liga ou Fuga\n");
rebonatto 0:c64e1194230b 138 if (m_Channel % 2 == 1){ // Canais impares sao de diferencial
rebonatto 0:c64e1194230b 139 //m_tempo.stop();
rebonatto 0:c64e1194230b 140 tempofuga = (int) (Settings::get_EventLimit() * UMCICLO) + m_tempo.read_ms();
rebonatto 0:c64e1194230b 141 //printf("Limite %d\n", (int) (Settings::get_EventLimit() * UMCICLO));
rebonatto 0:c64e1194230b 142 m_tempo.reset();
rebonatto 0:c64e1194230b 143 }
rebonatto 0:c64e1194230b 144 else
rebonatto 0:c64e1194230b 145 tempofuga = 0;
rebonatto 0:c64e1194230b 146 m_OutletTriggered = false;
rebonatto 0:c64e1194230b 147 Capture::Stop();
rebonatto 0:c64e1194230b 148 OnTrigger(rmsvalue, mv2, under, over, tempofuga);//TODO: must change the parameter of this function call
rebonatto 0:c64e1194230b 149 //printf("===> contliga %d contdesliga %d\n", contliga, contdesl);
rebonatto 0:c64e1194230b 150 //zzz
rebonatto 0:c64e1194230b 151 Capture::Start();
rebonatto 0:c64e1194230b 152 m_EventCounter = 0;
rebonatto 0:c64e1194230b 153 }
rebonatto 0:c64e1194230b 154 }
rebonatto 0:c64e1194230b 155 else
rebonatto 0:c64e1194230b 156 m_EventCounter = 0;
rebonatto 0:c64e1194230b 157 }
rebonatto 0:c64e1194230b 158 } // Final gerafuga
rebonatto 0:c64e1194230b 159 }
rebonatto 0:c64e1194230b 160
rebonatto 0:c64e1194230b 161 void EventDetector::ShowValues(CaptureEvent* e)
rebonatto 0:c64e1194230b 162 {
rebonatto 0:c64e1194230b 163 printf("RFID: %s\n", e->get_RFID());
rebonatto 0:c64e1194230b 164 printf("type: %d\n", e->get_Type());
rebonatto 0:c64e1194230b 165 printf("OutletNr: %d\n", e->get_OutletNumber());
rebonatto 0:c64e1194230b 166 printf("MeanValue: %f\n", e->get_MeanValue());
rebonatto 0:c64e1194230b 167 printf("MV2: %f\n", e->get_MV2());
rebonatto 0:c64e1194230b 168 printf("RMSValue: %f\n", e->get_RMSValue());
rebonatto 0:c64e1194230b 169 printf("Underflow: %d\n", e->get_Under());
rebonatto 0:c64e1194230b 170 printf("Overflow: %d\n", e->get_Over());
rebonatto 0:c64e1194230b 171 printf("Gain: %f\n", e->get_Gain());
rebonatto 0:c64e1194230b 172 printf("Offset: %d\n", e->get_Offset());
rebonatto 0:c64e1194230b 173 printf("Duration: %d\n", e->get_Duration());
rebonatto 0:c64e1194230b 174
rebonatto 0:c64e1194230b 175 int i;
rebonatto 0:c64e1194230b 176 for(i=0;i<12;i++)
rebonatto 0:c64e1194230b 177 {
rebonatto 0:c64e1194230b 178 printf("Harm %d Sen %f Cos %f\n ", i, e->get_SineValue(i), e->get_CossineValue(i));
rebonatto 0:c64e1194230b 179 }
rebonatto 0:c64e1194230b 180
rebonatto 0:c64e1194230b 181 }
rebonatto 0:c64e1194230b 182
rebonatto 0:c64e1194230b 183 //void EventDetector::OnTrigger(float rmsvalue)
rebonatto 0:c64e1194230b 184 void EventDetector::OnTrigger(float rmsvalue, float mv2, int under, int over, int duration)
rebonatto 0:c64e1194230b 185 {
rebonatto 0:c64e1194230b 186 SendMessage(0,rmsvalue, mv2, under, over, duration);
rebonatto 0:c64e1194230b 187 //printf("Ontrigger::Enviou mensagem\n");
rebonatto 0:c64e1194230b 188 /*
rebonatto 0:c64e1194230b 189 if(m_OutletTriggered)
rebonatto 0:c64e1194230b 190 {
rebonatto 0:c64e1194230b 191 for(int i=0;i<Settings::get_MaxChannels();i++)
rebonatto 0:c64e1194230b 192 {
rebonatto 0:c64e1194230b 193 //Thread::wait(300);
rebonatto 0:c64e1194230b 194 if(i != m_Channel){
rebonatto 0:c64e1194230b 195 //printf("Ontrigger::Enviou acompanhamento %d\n", i);
rebonatto 0:c64e1194230b 196 get_Detector(i).ExternalTrigger();
rebonatto 0:c64e1194230b 197 }
rebonatto 0:c64e1194230b 198 }
rebonatto 0:c64e1194230b 199 //printf("Ontrigger::Enviou acompanhamentos %d\n");
rebonatto 0:c64e1194230b 200 }
rebonatto 0:c64e1194230b 201 */
rebonatto 0:c64e1194230b 202 }
rebonatto 0:c64e1194230b 203
rebonatto 0:c64e1194230b 204 void EventDetector::ExternalTrigger()
rebonatto 0:c64e1194230b 205 {
rebonatto 0:c64e1194230b 206 // Ajustar valores de mv2, under, over e duration na chamada!!!
rebonatto 0:c64e1194230b 207 SendMessage(1, 0, 0, 0, 0, 0);
rebonatto 0:c64e1194230b 208 }
rebonatto 0:c64e1194230b 209
rebonatto 0:c64e1194230b 210 //void EventDetector::SendMessage(int ext,float rmsvalue)
rebonatto 0:c64e1194230b 211 void EventDetector::SendMessage(int ext, float rmsvalue, float mv2, int under, int over, int duration)
rebonatto 0:c64e1194230b 212 {
rebonatto 1:917ca6b5d9d9 213 //printf("Chegou SendMessage\n");
rebonatto 0:c64e1194230b 214 //Here we must alloc a CaptureEvent object from mailbox pool,
rebonatto 0:c64e1194230b 215 CaptureEvent* event = GetMailbox().alloc();
rebonatto 0:c64e1194230b 216 //printf("Capturou evento\n");
rebonatto 0:c64e1194230b 217 //then initialize the object properly
rebonatto 0:c64e1194230b 218
rebonatto 0:c64e1194230b 219 unsigned short int buf[NUMBER_OF_SAMPLES];
rebonatto 0:c64e1194230b 220 Capture::CopyBuffer(m_Channel,buf);
rebonatto 0:c64e1194230b 221
rebonatto 0:c64e1194230b 222 if(ext)
rebonatto 0:c64e1194230b 223 {
rebonatto 0:c64e1194230b 224 rmsvalue = 0;//SignalProcessor::CalculateRMS(buf,m_Channel);
rebonatto 0:c64e1194230b 225 }
rebonatto 0:c64e1194230b 226
rebonatto 0:c64e1194230b 227 float seno[NUMBER_OF_HARMONICS+1],coss[NUMBER_OF_HARMONICS+1],mv;
rebonatto 0:c64e1194230b 228 //SignalProcessor::CalculateFFT(buf,sen,cos,&mv,1);
rebonatto 0:c64e1194230b 229
rebonatto 0:c64e1194230b 230 int type=0,outlet_number=0, aux=0;
rebonatto 0:c64e1194230b 231 aux = Settings::get_OutletNumber(m_Channel);
rebonatto 0:c64e1194230b 232 outlet_number = Settings::get_Outlet(aux);
rebonatto 1:917ca6b5d9d9 233
rebonatto 1:917ca6b5d9d9 234 //Temporario - Sem leitor de RFID
rebonatto 0:c64e1194230b 235 char rfid[9] = "1234560";
rebonatto 0:c64e1194230b 236 rfid[7] = (char)outlet_number + '0';
rebonatto 0:c64e1194230b 237
rebonatto 1:917ca6b5d9d9 238 // Com leitor de RFID
rebonatto 1:917ca6b5d9d9 239 /*
rebonatto 1:917ca6b5d9d9 240 //send hitag request
rebonatto 1:917ca6b5d9d9 241 //capture hitag response
rebonatto 1:917ca6b5d9d9 242 //printf("OUTLET=%d\n",outlet_index+1);
rebonatto 1:917ca6b5d9d9 243
rebonatto 1:917ca6b5d9d9 244 if(m_OutletTriggered)
rebonatto 1:917ca6b5d9d9 245 Capture::ReadRFID(outlet_index+1,m_RFID);
rebonatto 1:917ca6b5d9d9 246 */
rebonatto 1:917ca6b5d9d9 247
rebonatto 1:917ca6b5d9d9 248
rebonatto 0:c64e1194230b 249 if(Settings::get_Purpose(m_Channel) == 'p') // phase channel
rebonatto 0:c64e1194230b 250 {
rebonatto 0:c64e1194230b 251 if(ext!=0)
rebonatto 0:c64e1194230b 252 type = 3;
rebonatto 0:c64e1194230b 253 else
rebonatto 0:c64e1194230b 254 {
rebonatto 0:c64e1194230b 255 if(m_OutletTriggered)
rebonatto 0:c64e1194230b 256 type = 4; // power on event
rebonatto 0:c64e1194230b 257 else
rebonatto 0:c64e1194230b 258 type = 5; // power off event
rebonatto 0:c64e1194230b 259 }
rebonatto 0:c64e1194230b 260 }
rebonatto 0:c64e1194230b 261 if(Settings::get_Purpose(m_Channel) == 'd') // diferential channel (leakage)
rebonatto 0:c64e1194230b 262 {
rebonatto 0:c64e1194230b 263 if(ext!=0)
rebonatto 0:c64e1194230b 264 type = 2;
rebonatto 0:c64e1194230b 265 else
rebonatto 0:c64e1194230b 266 {
rebonatto 0:c64e1194230b 267 if(m_OutletTriggered)
rebonatto 0:c64e1194230b 268 type = 1; // start leakage event
rebonatto 0:c64e1194230b 269 else
rebonatto 0:c64e1194230b 270 type = 6; // stop leakage event
rebonatto 0:c64e1194230b 271 }
rebonatto 0:c64e1194230b 272 }
rebonatto 0:c64e1194230b 273
rebonatto 1:917ca6b5d9d9 274 printf("Passou algum troço\n");
rebonatto 0:c64e1194230b 275 if (type == 1 || type == 2 || type == 4) // Calula FFT s nos eventos de fuga, acompanhamento de fuga (diferencial) e liga
rebonatto 0:c64e1194230b 276 SignalProcessor::CalculateFFT(buf,seno,coss,&mv,1, m_Channel);
rebonatto 0:c64e1194230b 277 /*
rebonatto 0:c64e1194230b 278 for(int y=0; y < 12; y++)
rebonatto 0:c64e1194230b 279 printf("[%d] sen %f cos %f\n", y, seno[y], coss[y]);
rebonatto 0:c64e1194230b 280 */
rebonatto 0:c64e1194230b 281 else
rebonatto 0:c64e1194230b 282 for(int i=0; i < Settings::get_MaxHarmonics(); i++)
rebonatto 0:c64e1194230b 283 seno[i] = coss[i] = 0;
rebonatto 0:c64e1194230b 284
rebonatto 0:c64e1194230b 285 //event->Setup(rfid,type,outlet_number,mv,rmsvalue,Settings::get_Gain(m_Channel),Settings::get_Offset(m_Channel),seno,coss);
rebonatto 1:917ca6b5d9d9 286
rebonatto 1:917ca6b5d9d9 287 printf("Passou FFT\n");
rebonatto 0:c64e1194230b 288 event->Setup(rfid,type,outlet_number,mv,mv2, rmsvalue,under, over, Settings::get_Gain(m_Channel),Settings::get_Offset(m_Channel),duration, seno,coss);
rebonatto 0:c64e1194230b 289
rebonatto 0:c64e1194230b 290 //printf("\n\nDuration: %d\n\n", duration);
rebonatto 1:917ca6b5d9d9 291 ShowValues(event);
rebonatto 0:c64e1194230b 292
rebonatto 0:c64e1194230b 293 //and finally place the object in the mailbox queue.
rebonatto 0:c64e1194230b 294 GetMailbox().put(event);
rebonatto 0:c64e1194230b 295 //printf("Deu put no evento no mailBox\n");
rebonatto 0:c64e1194230b 296 }
rebonatto 0:c64e1194230b 297
rebonatto 0:c64e1194230b 298 int EventDetector::TimeDelay(int t){
rebonatto 0:c64e1194230b 299 switch (t){
rebonatto 0:c64e1194230b 300 case 0: return 300;
rebonatto 0:c64e1194230b 301 case 1: return 250;
rebonatto 0:c64e1194230b 302 case 2: return 200;
rebonatto 0:c64e1194230b 303 case 3: return 250;
rebonatto 0:c64e1194230b 304 case 4: return 200;
rebonatto 0:c64e1194230b 305 default: return 150;
rebonatto 0:c64e1194230b 306 }
rebonatto 0:c64e1194230b 307 }