Versão atual 13-12-2013.

Dependencies:   EthernetInterface mbed-rtos mbed

Codes/EventDetector.cpp

Committer:
rebonatto
Date:
2013-12-13
Revision:
1:238ac24e46dd
Parent:
0:65c41a68b49a

File content as of revision 1:238ac24e46dd:

/*
 * EventDetector.cpp
 *
 *  Created on: 
 *      Author: 
 */
 
 #include "EventDetector.h"
 #include "CommTCP.h"
 
 #define MARCA 10

CaptureMailbox EventDetector::m_EventMailbox;
EventDetector EventDetector::m_Detector[NUMBER_OF_CHANNELS] = {0,1,2,3,4,5};
static int cont=0;

CaptureEvent::CaptureEvent()
{
}

void CaptureEvent::Setup(char* rfid,int type,int outlet,float mv,float rms,float gain, int offset,float* sin, float* cos)
{
    memcpy(m_RFID,rfid,9);
    m_Type = type;
    m_OutletNumber = outlet;
    m_MeanValue = mv;
    m_RMSValue = rms;
    m_Gain = gain;
    m_Offset = offset;
    memcpy(m_Sin,sin,Settings::get_MaxHarmonics()*sizeof(float));
    memcpy(m_Cos,cos,Settings::get_MaxHarmonics()*sizeof(float));
}

EventDetector::EventDetector(int ch)
{
    m_Channel = ch;
    m_OutletTriggered = false;
    m_EventCounter = 0;
}
    
    
void EventDetector::ProcessEvent(float rmsvalue, int t)
{
    int gerafuga = 0;
    
    //wait_ms(500);//TimeDelay(t));
    //printf("%d time delay\n", TimeDelay(t));
    if (gerafuga && (t % 2 == 0) ){            
            if (cont % MARCA == 0)
                printf("Envia Fuga %d %d\n", cont, TimeDelay(t));
            cont++;
    // Fuga
                m_OutletTriggered = true;  
                Capture::Stop();              
                //printf("Passou Stop\n");
                //CommTCP::RequestAcom();
                OnTrigger(rmsvalue);       //TODO: must change the parameter of this function call
                //printf("Passou OnTriger\n");
                Capture::Start();
                //printf("Passou Start\n");
                m_EventCounter = 0;

    wait_ms(2);
    // Termino
            if (cont % MARCA == 0)
                printf("Envia Termino\n");
                m_OutletTriggered = false;
                Capture::Stop();
                //printf("Passou Stop\n");
                OnTrigger(rmsvalue);//TODO: must change the parameter of this function call
                //printf("Passou onTrigger\n");
                Capture::Start();
                //printf("Passou Start\n");
                m_EventCounter = 0;
                
    wait_ms(2);
    }
    else{
    
    if(rmsvalue > Settings::get_Limit(m_Channel))
    {
        if(!m_OutletTriggered)
        {
            if(m_EventCounter < Settings::get_EventLimit())
            {
                m_EventCounter++;
            }
            else
            {
                //printf("Deu Fuga\n");
                m_OutletTriggered = true;  
                Capture::Stop();              
                OnTrigger(rmsvalue); //TODO: must change the parameter of this function call
                //CommTCP::RequestAcom();
                Capture::Start();
                m_EventCounter = 0;
            }
        }
        else
            m_EventCounter = 0;
    }
    else
    {
        if(m_OutletTriggered)
        {
            if(m_EventCounter < Settings::get_EventLimit())
                m_EventCounter++;
            else
            {
                m_OutletTriggered = false;
                Capture::Stop();
                OnTrigger(rmsvalue);//TODO: must change the parameter of this function call
                Capture::Start();
                m_EventCounter = 0;
            }
        }
        else
            m_EventCounter = 0;
    }
    } // Final gerafuga
}
            
void EventDetector::ShowValues(CaptureEvent* e)
{        
    printf("RFID: %s\n", e->get_RFID());
    printf("type: %d\n", e->get_Type());    
    printf("OutletNr: %d\n", e->get_OutletNumber());
    printf("MeanValue: %f\n", e->get_MeanValue());
    printf("RMSValue: %f\n", e->get_RMSValue());
    printf("Gain: %f\n", e->get_Gain());
    printf("Offset: %d\n", e->get_Offset());
    
    int i;
    for(i=0;i<12;i++)
    {
        printf("Harm %d Sen %f Cos %f\n ", i, e->get_SineValue(i), e->get_CossineValue(i));
    }
}

void EventDetector::OnTrigger(float rmsvalue)
{
    SendMessage(0,rmsvalue);
    //printf("Ontrigger::Enviou mensagem\n");
    /*
    if(m_OutletTriggered)
    {
        for(int i=0;i<Settings::get_MaxChannels();i++)
        {
            //wait_ms(300);
            if(i != m_Channel){
                //printf("Ontrigger::Enviou acompanhamento %d\n", i);
                get_Detector(i).ExternalTrigger();
            }
        }
        //printf("Ontrigger::Enviou acompanhamentos %d\n");
    }
    */
}

void EventDetector::ExternalTrigger()
{
    SendMessage(1,0);
}

void EventDetector::SendMessage(int ext,float rmsvalue)
{   
    
    //Here we must alloc a CaptureEvent object from mailbox pool,
    CaptureEvent* event = GetMailbox().alloc();
    //printf("Capturou evento\n");
    //then initialize the object properly
    
    unsigned short int buf[NUMBER_OF_SAMPLES];
    Capture::CopyBuffer(m_Channel,buf);
    
    if(ext)
    {
        rmsvalue = 0;//SignalProcessor::CalculateRMS(buf,m_Channel);
    }
    
    float seno[NUMBER_OF_HARMONICS],coss[NUMBER_OF_HARMONICS],mv;
    //SignalProcessor::CalculateFFT(buf,sen,cos,&mv,1);
        
    int type=0,outlet_number=0;
    outlet_number = Settings::get_OutletNumber(m_Channel);
    outlet_number = Settings::get_Outlet(outlet_number);
    //Temporario
    char rfid[9] = "1234560";
    rfid[7] = (char)outlet_number + '0';
    
    if(Settings::get_Purpose(m_Channel) == 'p') // phase channel 
    {
        if(ext!=0)
            type = 3;
        else
        {
            if(m_OutletTriggered)
                type = 4;                           // power on event
            else
                type = 5;                           // power off event
        }
    }
    if(Settings::get_Purpose(m_Channel) == 'd') // diferential channel (leakage)
    {
        if(ext!=0)
            type = 2;
        else
        {
            if(m_OutletTriggered)
                type = 1;                           // start leakage event
            else
                type = 6;                           // stop leakage event
        }
    }
    
    if (type == 1 || type == 2 || type == 4) // Calula FFT s nos eventos de fuga, acompanhamento de fuga (diferencial) e liga
        SignalProcessor::CalculateFFT(buf,seno,coss,&mv,1);
        /*
        for(int y=0; y < 12; y++)
            printf("[%d] sen %f cos %f\n", y, seno[y], coss[y]);
        */
    else
        for(int i=0; i < Settings::get_MaxHarmonics(); i++)
            seno[i] = coss[i] = 0; 
            
    event->Setup(rfid,type,outlet_number,mv,rmsvalue,Settings::get_Gain(m_Channel),Settings::get_Offset(m_Channel),seno,coss);
    
    //ShowValues(event);       
           
    //and finally place the object in the mailbox queue.
    GetMailbox().put(event);
    //printf("Deu put no evento no mailBox\n");
}

int EventDetector::TimeDelay(int t){    
    switch (t){
        case 0: return 300;
        case 1: return 250;
        case 2: return 200;
        case 3: return 250;
        case 4: return 200;
        default: return 150; 
    }
}