Program Listing for File hss-shield-bts700x.cpp

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

#include "hss-shield-bts700x.hpp"

using namespace hss;
Bts700xShield::Bts700xShield(GPIOPAL *led1, GPIOPAL *led2, GPIOPAL *led3, GPIOPAL *led4, Hss *hsw1, Hss *hsw2, Hss *hsw3, Hss *hsw4, TimerPAL *timer,
                             GPIOPAL *oloff, GPIOPAL *pushButtonDigital, ADCPAL *pushButtonAnalog, ADCPAL *vBat, BtxVariants_t* btxVariant)
{
    this->led1 = led1;
    this->led2 = led2;
    this->led3 = led3;
    this->led4 = led4;

    this->hss1 = hsw1;
    this->hss2 = hsw2;
    this->hss3 = hsw3;
    this->hss4 = hsw4;

    this->timer = timer;

    this->oloff = oloff;
    this->pushButtonDigital = pushButtonDigital;

    this->pushButtonAnalog = pushButtonAnalog;
    this->vBat = vBat;

    this->btxVariant = btxVariant;
}

Bts700xShield::~Bts700xShield()
{

}

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

    do{
        if(NULL != led1){
            err = led1->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != led2){
            err = led2->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != led3){
            err = led3->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != led4){
            err = led4->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != hss1){
            err = hss1->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != hss2){
            err = hss2->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != hss3){
            err = hss3->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != hss4){
            err = hss4->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != timer){
            err = timer->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != oloff){
            err = oloff->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != pushButtonDigital){
            err = pushButtonDigital->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != pushButtonAnalog){
            err = pushButtonAnalog->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != vBat){
            err = vBat->init();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        filterVbat = new ExponentialFilter(0.0, 0.4);

        if(NULL == btxVariant){
            return NULLPTR_ERROR;
        }

    } while (0);

    return err;
}

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

     do{
        if(NULL != led1){
            err = led1->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != led2){
            err = led2->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != led3){
            err = led3->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != led4){
            err = led4->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != hss1){
            err = hss1->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != hss2){
            err = hss2->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != hss3){
            err = hss3->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != hss4){
            err = hss4->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != timer){
            err = timer->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != oloff){
            err = oloff->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != pushButtonDigital){
            err = pushButtonDigital->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != pushButtonAnalog){
            err = pushButtonAnalog->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL != vBat){
            err = vBat->deinit();
            if(OK != err){
                break;
            }
        }
        else{
            err = NULLPTR_ERROR;
            break;
        }

        if(NULL == btxVariant){
            return NULLPTR_ERROR;
        }

    } while (0);

    return err;
}

Error_t Bts700xShield::switchHxOn(uint8_t x)
{
    Error_t err = OK;

    switch(x)
    {
        case 1:
            err = hss1->enable();
            if (NULL != led1 && OK == err)
                err = led1->enable();
            break;

        case 2:
            err = hss2->enable();
            if (NULL != led2 && OK == err)
                err = led2->enable();
            break;

        case 3:
            err = hss3->enable();
            if (NULL != led3 && OK == err)
                err = led3->enable();
            break;

        case 4:
            err = hss4->enable();
            if (NULL != led4 && OK == err)
                err = led4->enable();
            break;
    }

    return err;
}

Error_t Bts700xShield::switchHxOff(uint8_t x)
{
    Error_t err = OK;

    switch(x)
    {
        case 1:
            err = hss1->disable();
            if (NULL != led1 && OK == err)
                err = led1->disable();
            break;

        case 2:
            err = hss2->disable();
            if (NULL != led2 && OK == err)
                err = led2->disable();
            break;

        case 3:
            err = hss3->disable();
            if (NULL != led3 && OK == err)
                err = led3->disable();
            break;

        case 4:
            err = hss4->disable();
            if (NULL != led4 && OK == err)
                err = led4->disable();
            break;
    }

    return err;
}

Error_t Bts700xShield::switchesHxOn(bool h1, bool h2, bool h3, bool h4)
{
    Error_t err = OK;

    do{
        if(h1 == true){
            err = hss1->enable();
            if (NULL != led1 && OK == err)
                err = led1->enable();
            else
                break;
        }

        if(h2 == true){
            err = hss2->enable();
            if (NULL != led2 && OK == err)
                err = led2->enable();
            else
                break;
        }

        if(h3 == true){
            err = hss3->enable();
            if (NULL != led3 && OK == err)
                err = led3->enable();
            else
                break;
        }

        if(h4 == true){
            err = hss4->enable();
            if (NULL != led4 && OK == err)
                err = led4->enable();
            else
                break;
        }
    } while (0);

    return err;
}

Error_t Bts700xShield::switchesHxOff(bool h1, bool h2, bool h3, bool h4)
{
    Error_t err = OK;

    do{
        if(h1 == true){
            err = hss1->disable();
            if (NULL != led1 && OK == err)
                err = led1->disable();
            else
                break;
        }

        if(h2 == true){
            err = hss2->disable();
            if (NULL != led2 && OK == err)
                err = led2->disable();
            else
                break;
        }

        if(h3 == true){
            err = hss3->disable();
            if (NULL != led3 && OK == err)
                err = led3->disable();
            else
                break;
        }

        if(h4 == true){
            err = hss4->disable();
            if (NULL != led4 && OK == err)
                err = led4->disable();
            else
                break;
        }
    } while (0);

    return err;
}

DiagStatus_t Bts700xShield::readDiagx(uint8_t x)
{
    DiagStatus_t diagStatus = NORMAL;

    float currentOn = 0.0;
    float currentOff = 0.0;

    switch(x)
    {
        case 1:
            hss1->enableDiag();
            if(hss1->getSwitchStatus() == POWER_ON)
            {
                currentOn = readIsx(1); // Il
                diagStatus = hss1->diagRead(currentOn);
            }
            else
            {
                oloff->enable();
                timer->delayMicro(300);
                currentOn = readIsx(1);

                oloff->disable();
                timer->delayMicro(400);
                currentOff = readIsx(1);
                diagStatus = diagnosisOff(currentOn, currentOff);
            }
            hss1->disableDiag();
            break;

        case 2:
            hss2->enableDiag();
            if(hss2->getSwitchStatus() == POWER_ON)
            {
                currentOn = readIsx(2);
                diagStatus = hss2->diagRead(currentOn);
            }
            else
            {
                oloff->enable();
                timer->delayMicro(300);
                currentOn = readIsx(2);

                oloff->disable();
                timer->delayMicro(400);
                currentOff = readIsx(2);
                diagStatus = diagnosisOff(currentOn, currentOff);
            }
            hss2->disableDiag();
            break;

        case 3:
            hss3->enableDiag();
            if(hss3->getSwitchStatus() == POWER_ON)
            {
                currentOn = readIsx(3);
                diagStatus = hss3->diagRead(currentOn);
            }
            else
            {
                oloff->enable();
                timer->delayMicro(300);
                currentOn = readIsx(3);

                oloff->disable();
                timer->delayMicro(400);
                currentOff = readIsx(3);
                diagStatus = diagnosisOff(currentOn, currentOff);
            }
            hss3->disableDiag();
            break;

        case 4:
            hss4->enableDiag();
            if(hss4->getSwitchStatus() == POWER_ON)
            {
                currentOn = readIsx(4);
                diagStatus = hss4->diagRead(currentOn);
            }
            else
            {
                oloff->enable();
                timer->delayMicro(300);
                currentOn = readIsx(4);

                oloff->disable();
                timer->delayMicro(400);
                currentOff = readIsx(4);
                diagStatus = diagnosisOff(currentOn, currentOff);
            }
            hss4->disableDiag();
            break;
    }

    return diagStatus;
}

float Bts700xShield::readIsx(uint8_t x)
{
    float isVal = 0.0;

    switch (x)
    {
        case 1:
            hss1->enableDiag();
            isVal = hss1->readIs(rSense);
            hss1->disableDiag();
            break;

        case 2:
            hss2->enableDiag();
            isVal = hss2->readIs(rSense);
            hss2->disableDiag();
            break;

        case 3:
            hss3->enableDiag();
            isVal = hss3->readIs(rSense);
            hss3->disableDiag();
            break;

        case 4:
            hss4->enableDiag();
            isVal = hss4->readIs(rSense);
            hss4->disableDiag();
            break;
    }

    return isVal;
}

float Bts700xShield::readVss()
{
    uint16_t adcResult = 0;
    float voltage = 0.0;

    adcResult = vBat->ADCRead();
    voltage = adcResult * ((float)5/(float)1024);   // Vmax/1024 LSB = Resolution of the ADC
    voltage = (voltage - vBatOffset);
    voltage = voltage * ((float)57/(float)10);      // 57/10 = Reverse Voltage divider to get the supply voltage

    filterVbat->input(voltage);

    return filterVbat->output();
}

bool Bts700xShield::digitalReadButton()
{
    if(pushButtonDigital->read() == GPIOPAL::GPIO_LOW){
        return true;
    }
    else{
        return false;
    }
}

bool Bts700xShield::analogReadButton()
{
    uint16_t result = 0;

    result = pushButtonAnalog->ADCRead();
    if(result < 20){
        return true;
    }
    else{
        return false;
    }
}

void Bts700xShield::setVoltageOffset(float offset)
{
    vBatOffset = offset;
}

DiagStatus_t Bts700xShield::diagnosisOff(float currentOn, float currentOff)
{
    if((currentOn > (btxVariant->iisOl * btxVariant->kilis)) && (currentOn < (btxVariant->iisFault * btxVariant->kilis))){
        if((currentOff > (btxVariant->iisOl * btxVariant->kilis)) && (currentOff < (btxVariant->iisFault * btxVariant->kilis))){
            return SHORT_TO_VSS;
        }
        else{
            return OPEN_LOAD;
        }
    }
    else{
        if((currentOn > (btxVariant->iisFault * btxVariant->kilis))){
            return SHORT_TO_GND_OR_OT;
        }
        else{
            return NORMAL;
        }
    }
}