Program Listing for File hss.cpp

Return to documentation for file (src/corelib/hss.cpp)

#include <stdint.h>
#include "hss.hpp"

using namespace hss;

Hss::Hss(GPIOPAL *den, GPIOPAL *in, ADCPAL *is, TimerPAL *timer, BtxVariants_t *btxVariant)
{
    this->den = den;
    this->in0 = in;
    this->in1 = nullptr;
    this->is  = is;
    this->dsel = nullptr;

    this->timer = timer;

    this->btxVariant = btxVariant;

    currentFilter = new ExponentialFilter(0.0, 0.3);

    status = UNINITED;
    diagEnb = DIAG_DIS;
    diagStatus = NOT_ENABLED;
}

Hss::Hss(GPIOPAL *den, GPIOPAL *in0, GPIOPAL *in1,  GPIOPAL *dsel, ADCPAL *is, TimerPAL *timer, BtxVariants_t *btxVariant)
{
    this->den = den;
    this->in0 = in0;
    this->in1 = in1;
    this->is = is;
    this->dsel = dsel;

    this->timer = timer;

    this->btxVariant = btxVariant;

    currentFilter = new ExponentialFilter(0.0, 0.3);

    status = UNINITED;
    diagEnb = DIAG_DIS;
    diagStatus = NOT_ENABLED;
}

Hss::~Hss()
{

}

Error_t Hss::init()
{
    Error_t err = OK;

    if(nullptr != den)
    {
        err = den->init();
        HSS_ASSERT_RET(err);
    }

    HSS_ASSERT_NULLPTR(in0);
    err = in0->init();
    HSS_ASSERT_RET(err);

    if(nullptr != in1)
    {
        err = in1->init();
        HSS_ASSERT_RET(err);
    }

    HSS_ASSERT_NULLPTR(is);
    err = is->init();
    HSS_ASSERT_RET(err);

    if(nullptr != dsel)
    {
        err = dsel->init();
        HSS_ASSERT_RET(err);
    }

    HSS_ASSERT_NULLPTR(timer);
    err = timer->init();
    HSS_ASSERT_RET(err);

    HSS_ASSERT_NULLPTR(btxVariant);

    status = INITED;
    statusCh0 = POWER_OFF;
    statusCh1 = POWER_OFF;

    return err;
}

Error_t Hss::deinit()
{
    Error_t err = OK;

    if(nullptr != den)
    {
        err = den->deinit();
        HSS_ASSERT_RET(err);
    }

    HSS_ASSERT_NULLPTR(in0);
    err = in0->deinit();
    HSS_ASSERT_RET(err);

    if(nullptr != in1)
    {
        err = in1->deinit();
        HSS_ASSERT_RET(err);
    }

    if(nullptr != dsel)
    {
        err = dsel->deinit();
        HSS_ASSERT_RET(err);
    }

    HSS_ASSERT_NULLPTR(is);
    err = is->deinit();
    HSS_ASSERT_RET(err);

    HSS_ASSERT_NULLPTR(timer);
    err = timer->deinit();
    HSS_ASSERT_RET(err);

    HSS_ASSERT_NULLPTR(btxVariant);

    status = UNINITED;
    statusCh0 = POWER_OFF;
    statusCh1 = POWER_OFF;

    return err;
}

Error_t Hss::enable(Channel_t ch)
{
    Error_t err = OK;

    if(UNINITED != status)
    {
        if(CHANNEL0 == ch || ALL_CHANNELS == ch)
        {
            HSS_ASSERT_NULLPTR(in0);
            err = in0->enable();
            HSS_ASSERT_RET(err);
            statusCh0 = POWER_ON;
        }
        if(CHANNEL1 == ch || ALL_CHANNELS == ch)
        {
            HSS_ASSERT_NULLPTR(in1);
            err = in1->enable();
            HSS_ASSERT_RET(err);
            statusCh1 = POWER_ON;
        }

        status = POWER_ON;
    }
    else
    {
        err = INIT_ERROR;
    }

    return err;
}

Error_t Hss::disable(Channel_t ch)
{
    Error_t err = OK;

    if(UNINITED != status)
    {

        if(CHANNEL0 == ch || ALL_CHANNELS == ch)
        {
            HSS_ASSERT_NULLPTR(in0);
            err = in0->disable();
            HSS_ASSERT_RET(err);
            statusCh0 = POWER_OFF;
        }
        if(CHANNEL1 == ch || ALL_CHANNELS == ch)
        {
            HSS_ASSERT_NULLPTR(in1);
            err = in1->disable();
            HSS_ASSERT_RET(err);
            statusCh1 = POWER_OFF;
        }

        if((POWER_OFF == statusCh0) && (POWER_OFF == statusCh1))
        {
            status = POWER_OFF;
        }
    }
    else
    {
        err = INIT_ERROR;
    }

    return err;
}

Error_t Hss::enableDiag()
{
    Error_t err = OK;

    if((nullptr != den) && (UNINITED != status))
    {
        err = den->enable();
        HSS_ASSERT_RET(err);

        diagEnb = DIAG_EN;
    }
    else if(nullptr == den)
    {
        diagEnb = DIAG_EN;
    }
    else
    {
        err = INIT_ERROR;
    }

    return err;
}

Error_t Hss::disableDiag()
{
    Error_t err = OK;

    if((nullptr != den) && (UNINITED != status))
    {
        err = den->disable();
        HSS_ASSERT_RET(err);

        diagEnb = DIAG_DIS;
    }
    else if(nullptr == den)
    {
        diagEnb = DIAG_EN;
    }
    else
    {
        err = INIT_ERROR;
    }

    return err;
}

Error_t Hss::selDiagCh(Channel_t ch)
{
    Error_t err = OK;

    if(nullptr != dsel)
    {
        if(CHANNEL0 == ch)
        {
            err = dsel->disable();
        }
        else if(CHANNEL1 == ch){
            err = dsel->enable();
        }
        else
        {
            return INVALID_CH_ERROR;
        }
    }

    return err;
}

Status_t Hss::getSwitchStatus()
{
    return status;
}

float Hss::readIs(uint16_t rSense, Channel_t ch)
{
    uint16_t adcVal = 0;
    float isVoltage = 0.0;
    float isCurrent = 0.0;

    if(UNINITED != status)
    {
        selDiagCh(ch);

        timer->delayMilli(1);
        adcVal = is->ADCRead();
        isVoltage = (adcVal/1024.0)*5.0;
        isCurrent = ((isVoltage*btxVariant->kilis)/rSense) - currentOffset;
        currentFilter->input(isCurrent);
    }

    return currentFilter->output();
}

DiagStatus_t Hss::diagRead(float senseCurrent, Channel_t ch)
{
    (void)ch;

    if(senseCurrent >= (btxVariant->iisFault * btxVariant->kilis)){
        diagStatus = FAULT;
    }
    else if((btxVariant->type == BTS700X) && (senseCurrent <= (btxVariant->iisEn * btxVariant->kilis))){
            diagStatus = FAULT_OL_IC;
    }
    else if((btxVariant->type == BTS5001X) && (senseCurrent <= (btxVariant->iisO * btxVariant->kilis))){
            diagStatus = FAULT_OL_IC;
    }
    else if((btxVariant->type == BTT60X0) && (senseCurrent <= (btxVariant->iisOl * btxVariant->kilis))){
            diagStatus = FAULT_OL_IC;
    }
    else{
        diagStatus = NORMAL;
    }

    return diagStatus;
}

void Hss::setCurrentOffset(float offset)
{
    currentOffset = offset;
}