![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Versão atual 13-12-2013.
Dependencies: EthernetInterface mbed-rtos mbed
Codes/EventDetector.cpp@0:65c41a68b49a, 2013-12-13 (annotated)
- Committer:
- rebonatto
- Date:
- Fri Dec 13 11:42:59 2013 +0000
- Revision:
- 0:65c41a68b49a
Versao atual 13-12-2013.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |