EZR

Dependencies:   CRC16 FreescaleIAP FreescaleWatchdog GGSProtocol LM75B PIMA Parameters PersistentCircularQueue SerialNumberV2COM mbed-dev-watchdog_2016_03_04

Fork of smartRamalKW by Equipe Firmware V2COM

memoriaMassa.cpp

Committer:
fprado
Date:
2016-06-16
Revision:
35:78614a27b9e6
Parent:
25:2c578b923ea9

File content as of revision 35:78614a27b9e6:

#include "memoriaMassa.h"

void MemoriaMassa::iniciaLeituras(int periodoSec, int size, int sector1, int sector2, int sector3){
    mmPeriodoSec = periodoSec;
    if(APP_PARAMETERS.ENABLE_LOAD_PROFILE > 0) {
        queue[0].init(size, sector1);
        queue[1].init(size, sector2);
        queue[2].init(size, sector3);
    }
    leituraPeriodica.attach(this, &MemoriaMassa::disparaLeitura, mmPeriodoSec);
    DEBUG(printf("[LP] Periodic Reading started (%d seconds)\r\n", mmPeriodoSec));
}

void MemoriaMassa::disparaLeitura(){
    lerAgora = true;
}

void MemoriaMassa::executaLeitura(){
    if(!lerAgora){
        return;
    }
    
    float f1 = getInstVoltage(0);
    float f2 = getInstVoltage(1);
    float f3 = getInstCurrent();
    
    if(APP_PARAMETERS.LOAD_CHANNEL == 0){
        f1 = f2 - f1;
    } else{
        f2 = f1 - f2;
    }
    
    if(APP_PARAMETERS.ENABLE_LOAD_PROFILE > 0) {
        LeituraMM leitura;
        leitura.value.floatValue = f1;
        leitura.time = time(NULL);
        queue[0].add((char*)&leitura);

        leitura.value.floatValue = f2;
        queue[1].add((char*)&leitura);

        leitura.value.floatValue = f3;
        queue[2].add((char*)&leitura);

        DEBUG(printf("[LP] Reading time = %s\r\n", ctime(&(leitura.time))));
        DEBUG(printf("[LP] New record stored: Time=%d, Ch0=%f\r\n", leitura.time, f1));
        DEBUG(printf("[LP] New record stored: Time=%d, Ch1=%f\r\n", leitura.time, f2));
        DEBUG(printf("[LP] New record stored: Time=%d, Ch2=%f\r\n", leitura.time, f3));
    }

    checkAlarms(f1, f2, f3);

    lerAgora = false;
}

char* MemoriaMassa::getMM(int channel){
    if(channel < 0 || channel > 2){
        DEBUG(printf("[LP] Invalid channel %d\r\n", channel));
        return NULL;
    }
    return queue[channel].getAll();
}

void MemoriaMassa::checkAlarms(float ch1, float ch2, float ch3){
    bool tensaoZero, tensaoMinima, tensaoMaxima, correnteZero, correnteMinima, correnteMaxima;
    int linha, carga, limiteZeroLinha, limiteZeroCarga;
    if(APP_PARAMETERS.LOAD_CHANNEL == 0){
        linha = (int)ch2;
        carga = (int)ch1;
        limiteZeroLinha = APP_PARAMETERS.LIMITE_TENSAO_ZERO_CH1_V;
        limiteZeroCarga = APP_PARAMETERS.LIMITE_TENSAO_ZERO_CH0_V;
    } else{
        linha = (int)ch1;
        carga = (int)ch2;
        limiteZeroLinha = APP_PARAMETERS.LIMITE_TENSAO_ZERO_CH0_V;
        limiteZeroCarga = APP_PARAMETERS.LIMITE_TENSAO_ZERO_CH1_V;
    }
    
    if((linha - carga) > (linha*APP_PARAMETERS.LIMITE_TENSAO_SENSOR_V)/100.0){
        ledLoad = LED_ON;
    } else if((linha - carga) < -(linha*APP_PARAMETERS.LIMITE_TENSAO_SENSOR_V)/100.0){
        ledLoad = LED_ON;
    } else{
        ledLoad = LED_OFF;
    }
    
    tensaoZero = linha < limiteZeroLinha;
    tensaoMinima = linha < APP_PARAMETERS.LIMITE_TENSAO_MINIMA_LINHA_V;
    tensaoMaxima = linha > APP_PARAMETERS.LIMITE_TENSAO_MAXIMA_LINHA_V;
    
    DEBUG(printf("[LP] Line Zero Voltage ST = %d\r\n", tensaoZero));
    DEBUG(printf("[LP] Line Undervoltage ST = %d\r\n", tensaoMinima));
    DEBUG(printf("[LP] Line Overvoltage  ST = %d\r\n", tensaoMaxima));
    
    if(isAlarmEnabled(ALARME_LINHA_TENSAO_ZERO)){
        alarm.writeAlarm(ALARME_LINHA_TENSAO_ZERO, tensaoZero, getAlarmState(ALARME_LINHA_TENSAO_ZERO));
    }
    if(isAlarmEnabled(ALARME_LINHA_TENSAO_MINIMA)){
        alarm.writeAlarm(ALARME_LINHA_TENSAO_MINIMA, tensaoMinima, getAlarmState(ALARME_LINHA_TENSAO_MINIMA));
    }
    if(isAlarmEnabled(ALARME_LINHA_TENSAO_MAXIMA)){
        alarm.writeAlarm(ALARME_LINHA_TENSAO_MAXIMA, tensaoMaxima, getAlarmState(ALARME_LINHA_TENSAO_MAXIMA));
    }
    
    tensaoZero = carga < limiteZeroCarga;
    tensaoMinima = carga < APP_PARAMETERS.LIMITE_TENSAO_MINIMA_CARGA_V;
    tensaoMaxima = carga > APP_PARAMETERS.LIMITE_TENSAO_MAXIMA_CARGA_V;
    
    DEBUG(printf("[LP] Load Zero Voltage ST = %d\r\n", tensaoZero));
    DEBUG(printf("[LP] Load Undervoltage ST = %d\r\n", tensaoMinima));
    DEBUG(printf("[LP] Load Overvoltage  ST = %d\r\n", tensaoMaxima));
    
    if(isAlarmEnabled(ALARME_CARGA_TENSAO_ZERO)){
        alarm.writeAlarm(ALARME_CARGA_TENSAO_ZERO, tensaoZero, getAlarmState(ALARME_CARGA_TENSAO_ZERO));
    }
    if(isAlarmEnabled(ALARME_CARGA_TENSAO_MINIMA)){
        alarm.writeAlarm(ALARME_CARGA_TENSAO_MINIMA, tensaoMinima, getAlarmState(ALARME_CARGA_TENSAO_MINIMA));
    }
    if(isAlarmEnabled(ALARME_CARGA_TENSAO_MAXIMA)){
        alarm.writeAlarm(ALARME_CARGA_TENSAO_MAXIMA, tensaoMaxima, getAlarmState(ALARME_CARGA_TENSAO_MAXIMA));
    }
    
    correnteZero = ch3 < APP_PARAMETERS.LIMITE_CORRENTE_ZERO_A.floatValue;
    correnteMinima = ch3 < APP_PARAMETERS.LIMITE_CORRENTE_MINIMA_A.floatValue;
    correnteMaxima = ch3 > APP_PARAMETERS.LIMITE_CORRENTE_MAXIMA_A.floatValue;
    
    DEBUG(printf("[LP] Zero Current ST = %d\r\n", correnteZero));
    DEBUG(printf("[LP] Undercurrent ST = %d\r\n", correnteMinima));
    DEBUG(printf("[LP] Overcurrent  ST = %d\r\n", correnteMaxima));
    
    if(isAlarmEnabled(ALARME_CORRENTE_ZERO)){
        alarm.writeAlarm(ALARME_CORRENTE_ZERO, correnteZero, getAlarmState(ALARME_CORRENTE_ZERO));
    }
    if(isAlarmEnabled(ALARME_CORRENTE_MINIMA)){
        alarm.writeAlarm(ALARME_CORRENTE_MINIMA, correnteMinima, getAlarmState(ALARME_CORRENTE_MINIMA));
    }
    if(isAlarmEnabled(ALARME_CORRENTE_MAXIMA)){
        alarm.writeAlarm(ALARME_CORRENTE_MAXIMA, correnteMaxima, getAlarmState(ALARME_CORRENTE_MAXIMA));
    }

}