Versão atual 13-12-2013.

Dependencies:   EthernetInterface mbed-rtos mbed

Committer:
rebonatto
Date:
Fri Dec 13 11:45:06 2013 +0000
Revision:
1:238ac24e46dd
Parent:
0:65c41a68b49a
Atual 13-12-2013.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rebonatto 0:65c41a68b49a 1 /*
rebonatto 0:65c41a68b49a 2 * EventDetector.cpp
rebonatto 0:65c41a68b49a 3 *
rebonatto 0:65c41a68b49a 4 * Created on:
rebonatto 0:65c41a68b49a 5 * Author:
rebonatto 0:65c41a68b49a 6 */
rebonatto 0:65c41a68b49a 7
rebonatto 0:65c41a68b49a 8 #include "EventDetector.h"
rebonatto 0:65c41a68b49a 9 #include "CommTCP.h"
rebonatto 0:65c41a68b49a 10
rebonatto 0:65c41a68b49a 11 #define MARCA 10
rebonatto 0:65c41a68b49a 12
rebonatto 0:65c41a68b49a 13 CaptureMailbox EventDetector::m_EventMailbox;
rebonatto 0:65c41a68b49a 14 EventDetector EventDetector::m_Detector[NUMBER_OF_CHANNELS] = {0,1,2,3,4,5};
rebonatto 0:65c41a68b49a 15 static int cont=0;
rebonatto 0:65c41a68b49a 16
rebonatto 0:65c41a68b49a 17 CaptureEvent::CaptureEvent()
rebonatto 0:65c41a68b49a 18 {
rebonatto 0:65c41a68b49a 19 }
rebonatto 0:65c41a68b49a 20
rebonatto 0:65c41a68b49a 21 void CaptureEvent::Setup(char* rfid,int type,int outlet,float mv,float rms,float gain, int offset,float* sin, float* cos)
rebonatto 0:65c41a68b49a 22 {
rebonatto 0:65c41a68b49a 23 memcpy(m_RFID,rfid,9);
rebonatto 0:65c41a68b49a 24 m_Type = type;
rebonatto 0:65c41a68b49a 25 m_OutletNumber = outlet;
rebonatto 0:65c41a68b49a 26 m_MeanValue = mv;
rebonatto 0:65c41a68b49a 27 m_RMSValue = rms;
rebonatto 0:65c41a68b49a 28 m_Gain = gain;
rebonatto 0:65c41a68b49a 29 m_Offset = offset;
rebonatto 0:65c41a68b49a 30 memcpy(m_Sin,sin,Settings::get_MaxHarmonics()*sizeof(float));
rebonatto 0:65c41a68b49a 31 memcpy(m_Cos,cos,Settings::get_MaxHarmonics()*sizeof(float));
rebonatto 0:65c41a68b49a 32 }
rebonatto 0:65c41a68b49a 33
rebonatto 0:65c41a68b49a 34 EventDetector::EventDetector(int ch)
rebonatto 0:65c41a68b49a 35 {
rebonatto 0:65c41a68b49a 36 m_Channel = ch;
rebonatto 0:65c41a68b49a 37 m_OutletTriggered = false;
rebonatto 0:65c41a68b49a 38 m_EventCounter = 0;
rebonatto 0:65c41a68b49a 39 }
rebonatto 0:65c41a68b49a 40
rebonatto 0:65c41a68b49a 41
rebonatto 0:65c41a68b49a 42 void EventDetector::ProcessEvent(float rmsvalue, int t)
rebonatto 0:65c41a68b49a 43 {
rebonatto 0:65c41a68b49a 44 int gerafuga = 0;
rebonatto 0:65c41a68b49a 45
rebonatto 0:65c41a68b49a 46 //wait_ms(500);//TimeDelay(t));
rebonatto 0:65c41a68b49a 47 //printf("%d time delay\n", TimeDelay(t));
rebonatto 0:65c41a68b49a 48 if (gerafuga && (t % 2 == 0) ){
rebonatto 0:65c41a68b49a 49 if (cont % MARCA == 0)
rebonatto 0:65c41a68b49a 50 printf("Envia Fuga %d %d\n", cont, TimeDelay(t));
rebonatto 0:65c41a68b49a 51 cont++;
rebonatto 0:65c41a68b49a 52 // Fuga
rebonatto 0:65c41a68b49a 53 m_OutletTriggered = true;
rebonatto 0:65c41a68b49a 54 Capture::Stop();
rebonatto 0:65c41a68b49a 55 //printf("Passou Stop\n");
rebonatto 0:65c41a68b49a 56 //CommTCP::RequestAcom();
rebonatto 0:65c41a68b49a 57 OnTrigger(rmsvalue); //TODO: must change the parameter of this function call
rebonatto 0:65c41a68b49a 58 //printf("Passou OnTriger\n");
rebonatto 0:65c41a68b49a 59 Capture::Start();
rebonatto 0:65c41a68b49a 60 //printf("Passou Start\n");
rebonatto 0:65c41a68b49a 61 m_EventCounter = 0;
rebonatto 0:65c41a68b49a 62
rebonatto 0:65c41a68b49a 63 wait_ms(2);
rebonatto 0:65c41a68b49a 64 // Termino
rebonatto 0:65c41a68b49a 65 if (cont % MARCA == 0)
rebonatto 0:65c41a68b49a 66 printf("Envia Termino\n");
rebonatto 0:65c41a68b49a 67 m_OutletTriggered = false;
rebonatto 0:65c41a68b49a 68 Capture::Stop();
rebonatto 0:65c41a68b49a 69 //printf("Passou Stop\n");
rebonatto 0:65c41a68b49a 70 OnTrigger(rmsvalue);//TODO: must change the parameter of this function call
rebonatto 0:65c41a68b49a 71 //printf("Passou onTrigger\n");
rebonatto 0:65c41a68b49a 72 Capture::Start();
rebonatto 0:65c41a68b49a 73 //printf("Passou Start\n");
rebonatto 0:65c41a68b49a 74 m_EventCounter = 0;
rebonatto 0:65c41a68b49a 75
rebonatto 0:65c41a68b49a 76 wait_ms(2);
rebonatto 0:65c41a68b49a 77 }
rebonatto 0:65c41a68b49a 78 else{
rebonatto 0:65c41a68b49a 79
rebonatto 0:65c41a68b49a 80 if(rmsvalue > Settings::get_Limit(m_Channel))
rebonatto 0:65c41a68b49a 81 {
rebonatto 0:65c41a68b49a 82 if(!m_OutletTriggered)
rebonatto 0:65c41a68b49a 83 {
rebonatto 0:65c41a68b49a 84 if(m_EventCounter < Settings::get_EventLimit())
rebonatto 0:65c41a68b49a 85 {
rebonatto 0:65c41a68b49a 86 m_EventCounter++;
rebonatto 0:65c41a68b49a 87 }
rebonatto 0:65c41a68b49a 88 else
rebonatto 0:65c41a68b49a 89 {
rebonatto 0:65c41a68b49a 90 //printf("Deu Fuga\n");
rebonatto 0:65c41a68b49a 91 m_OutletTriggered = true;
rebonatto 0:65c41a68b49a 92 Capture::Stop();
rebonatto 0:65c41a68b49a 93 OnTrigger(rmsvalue); //TODO: must change the parameter of this function call
rebonatto 0:65c41a68b49a 94 //CommTCP::RequestAcom();
rebonatto 0:65c41a68b49a 95 Capture::Start();
rebonatto 0:65c41a68b49a 96 m_EventCounter = 0;
rebonatto 0:65c41a68b49a 97 }
rebonatto 0:65c41a68b49a 98 }
rebonatto 0:65c41a68b49a 99 else
rebonatto 0:65c41a68b49a 100 m_EventCounter = 0;
rebonatto 0:65c41a68b49a 101 }
rebonatto 0:65c41a68b49a 102 else
rebonatto 0:65c41a68b49a 103 {
rebonatto 0:65c41a68b49a 104 if(m_OutletTriggered)
rebonatto 0:65c41a68b49a 105 {
rebonatto 0:65c41a68b49a 106 if(m_EventCounter < Settings::get_EventLimit())
rebonatto 0:65c41a68b49a 107 m_EventCounter++;
rebonatto 0:65c41a68b49a 108 else
rebonatto 0:65c41a68b49a 109 {
rebonatto 0:65c41a68b49a 110 m_OutletTriggered = false;
rebonatto 0:65c41a68b49a 111 Capture::Stop();
rebonatto 0:65c41a68b49a 112 OnTrigger(rmsvalue);//TODO: must change the parameter of this function call
rebonatto 0:65c41a68b49a 113 Capture::Start();
rebonatto 0:65c41a68b49a 114 m_EventCounter = 0;
rebonatto 0:65c41a68b49a 115 }
rebonatto 0:65c41a68b49a 116 }
rebonatto 0:65c41a68b49a 117 else
rebonatto 0:65c41a68b49a 118 m_EventCounter = 0;
rebonatto 0:65c41a68b49a 119 }
rebonatto 0:65c41a68b49a 120 } // Final gerafuga
rebonatto 0:65c41a68b49a 121 }
rebonatto 0:65c41a68b49a 122
rebonatto 0:65c41a68b49a 123 void EventDetector::ShowValues(CaptureEvent* e)
rebonatto 0:65c41a68b49a 124 {
rebonatto 0:65c41a68b49a 125 printf("RFID: %s\n", e->get_RFID());
rebonatto 0:65c41a68b49a 126 printf("type: %d\n", e->get_Type());
rebonatto 0:65c41a68b49a 127 printf("OutletNr: %d\n", e->get_OutletNumber());
rebonatto 0:65c41a68b49a 128 printf("MeanValue: %f\n", e->get_MeanValue());
rebonatto 0:65c41a68b49a 129 printf("RMSValue: %f\n", e->get_RMSValue());
rebonatto 0:65c41a68b49a 130 printf("Gain: %f\n", e->get_Gain());
rebonatto 0:65c41a68b49a 131 printf("Offset: %d\n", e->get_Offset());
rebonatto 0:65c41a68b49a 132
rebonatto 0:65c41a68b49a 133 int i;
rebonatto 0:65c41a68b49a 134 for(i=0;i<12;i++)
rebonatto 0:65c41a68b49a 135 {
rebonatto 0:65c41a68b49a 136 printf("Harm %d Sen %f Cos %f\n ", i, e->get_SineValue(i), e->get_CossineValue(i));
rebonatto 0:65c41a68b49a 137 }
rebonatto 0:65c41a68b49a 138 }
rebonatto 0:65c41a68b49a 139
rebonatto 0:65c41a68b49a 140 void EventDetector::OnTrigger(float rmsvalue)
rebonatto 0:65c41a68b49a 141 {
rebonatto 0:65c41a68b49a 142 SendMessage(0,rmsvalue);
rebonatto 0:65c41a68b49a 143 //printf("Ontrigger::Enviou mensagem\n");
rebonatto 0:65c41a68b49a 144 /*
rebonatto 0:65c41a68b49a 145 if(m_OutletTriggered)
rebonatto 0:65c41a68b49a 146 {
rebonatto 0:65c41a68b49a 147 for(int i=0;i<Settings::get_MaxChannels();i++)
rebonatto 0:65c41a68b49a 148 {
rebonatto 0:65c41a68b49a 149 //wait_ms(300);
rebonatto 0:65c41a68b49a 150 if(i != m_Channel){
rebonatto 0:65c41a68b49a 151 //printf("Ontrigger::Enviou acompanhamento %d\n", i);
rebonatto 0:65c41a68b49a 152 get_Detector(i).ExternalTrigger();
rebonatto 0:65c41a68b49a 153 }
rebonatto 0:65c41a68b49a 154 }
rebonatto 0:65c41a68b49a 155 //printf("Ontrigger::Enviou acompanhamentos %d\n");
rebonatto 0:65c41a68b49a 156 }
rebonatto 0:65c41a68b49a 157 */
rebonatto 0:65c41a68b49a 158 }
rebonatto 0:65c41a68b49a 159
rebonatto 0:65c41a68b49a 160 void EventDetector::ExternalTrigger()
rebonatto 0:65c41a68b49a 161 {
rebonatto 0:65c41a68b49a 162 SendMessage(1,0);
rebonatto 0:65c41a68b49a 163 }
rebonatto 0:65c41a68b49a 164
rebonatto 0:65c41a68b49a 165 void EventDetector::SendMessage(int ext,float rmsvalue)
rebonatto 0:65c41a68b49a 166 {
rebonatto 0:65c41a68b49a 167
rebonatto 0:65c41a68b49a 168 //Here we must alloc a CaptureEvent object from mailbox pool,
rebonatto 0:65c41a68b49a 169 CaptureEvent* event = GetMailbox().alloc();
rebonatto 0:65c41a68b49a 170 //printf("Capturou evento\n");
rebonatto 0:65c41a68b49a 171 //then initialize the object properly
rebonatto 0:65c41a68b49a 172
rebonatto 0:65c41a68b49a 173 unsigned short int buf[NUMBER_OF_SAMPLES];
rebonatto 0:65c41a68b49a 174 Capture::CopyBuffer(m_Channel,buf);
rebonatto 0:65c41a68b49a 175
rebonatto 0:65c41a68b49a 176 if(ext)
rebonatto 0:65c41a68b49a 177 {
rebonatto 0:65c41a68b49a 178 rmsvalue = 0;//SignalProcessor::CalculateRMS(buf,m_Channel);
rebonatto 0:65c41a68b49a 179 }
rebonatto 0:65c41a68b49a 180
rebonatto 0:65c41a68b49a 181 float seno[NUMBER_OF_HARMONICS],coss[NUMBER_OF_HARMONICS],mv;
rebonatto 0:65c41a68b49a 182 //SignalProcessor::CalculateFFT(buf,sen,cos,&mv,1);
rebonatto 0:65c41a68b49a 183
rebonatto 0:65c41a68b49a 184 int type=0,outlet_number=0;
rebonatto 0:65c41a68b49a 185 outlet_number = Settings::get_OutletNumber(m_Channel);
rebonatto 0:65c41a68b49a 186 outlet_number = Settings::get_Outlet(outlet_number);
rebonatto 0:65c41a68b49a 187 //Temporario
rebonatto 0:65c41a68b49a 188 char rfid[9] = "1234560";
rebonatto 0:65c41a68b49a 189 rfid[7] = (char)outlet_number + '0';
rebonatto 0:65c41a68b49a 190
rebonatto 0:65c41a68b49a 191 if(Settings::get_Purpose(m_Channel) == 'p') // phase channel
rebonatto 0:65c41a68b49a 192 {
rebonatto 0:65c41a68b49a 193 if(ext!=0)
rebonatto 0:65c41a68b49a 194 type = 3;
rebonatto 0:65c41a68b49a 195 else
rebonatto 0:65c41a68b49a 196 {
rebonatto 0:65c41a68b49a 197 if(m_OutletTriggered)
rebonatto 0:65c41a68b49a 198 type = 4; // power on event
rebonatto 0:65c41a68b49a 199 else
rebonatto 0:65c41a68b49a 200 type = 5; // power off event
rebonatto 0:65c41a68b49a 201 }
rebonatto 0:65c41a68b49a 202 }
rebonatto 0:65c41a68b49a 203 if(Settings::get_Purpose(m_Channel) == 'd') // diferential channel (leakage)
rebonatto 0:65c41a68b49a 204 {
rebonatto 0:65c41a68b49a 205 if(ext!=0)
rebonatto 0:65c41a68b49a 206 type = 2;
rebonatto 0:65c41a68b49a 207 else
rebonatto 0:65c41a68b49a 208 {
rebonatto 0:65c41a68b49a 209 if(m_OutletTriggered)
rebonatto 0:65c41a68b49a 210 type = 1; // start leakage event
rebonatto 0:65c41a68b49a 211 else
rebonatto 0:65c41a68b49a 212 type = 6; // stop leakage event
rebonatto 0:65c41a68b49a 213 }
rebonatto 0:65c41a68b49a 214 }
rebonatto 0:65c41a68b49a 215
rebonatto 0:65c41a68b49a 216 if (type == 1 || type == 2 || type == 4) // Calula FFT s nos eventos de fuga, acompanhamento de fuga (diferencial) e liga
rebonatto 0:65c41a68b49a 217 SignalProcessor::CalculateFFT(buf,seno,coss,&mv,1);
rebonatto 0:65c41a68b49a 218 /*
rebonatto 0:65c41a68b49a 219 for(int y=0; y < 12; y++)
rebonatto 0:65c41a68b49a 220 printf("[%d] sen %f cos %f\n", y, seno[y], coss[y]);
rebonatto 0:65c41a68b49a 221 */
rebonatto 0:65c41a68b49a 222 else
rebonatto 0:65c41a68b49a 223 for(int i=0; i < Settings::get_MaxHarmonics(); i++)
rebonatto 0:65c41a68b49a 224 seno[i] = coss[i] = 0;
rebonatto 0:65c41a68b49a 225
rebonatto 0:65c41a68b49a 226 event->Setup(rfid,type,outlet_number,mv,rmsvalue,Settings::get_Gain(m_Channel),Settings::get_Offset(m_Channel),seno,coss);
rebonatto 0:65c41a68b49a 227
rebonatto 0:65c41a68b49a 228 //ShowValues(event);
rebonatto 0:65c41a68b49a 229
rebonatto 0:65c41a68b49a 230 //and finally place the object in the mailbox queue.
rebonatto 0:65c41a68b49a 231 GetMailbox().put(event);
rebonatto 0:65c41a68b49a 232 //printf("Deu put no evento no mailBox\n");
rebonatto 0:65c41a68b49a 233 }
rebonatto 0:65c41a68b49a 234
rebonatto 0:65c41a68b49a 235 int EventDetector::TimeDelay(int t){
rebonatto 0:65c41a68b49a 236 switch (t){
rebonatto 0:65c41a68b49a 237 case 0: return 300;
rebonatto 0:65c41a68b49a 238 case 1: return 250;
rebonatto 0:65c41a68b49a 239 case 2: return 200;
rebonatto 0:65c41a68b49a 240 case 3: return 250;
rebonatto 0:65c41a68b49a 241 case 4: return 200;
rebonatto 0:65c41a68b49a 242 default: return 150;
rebonatto 0:65c41a68b49a 243 }
rebonatto 0:65c41a68b49a 244 }