Program Listing for File hss-shield-bth500xx.cpp

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

#include "hss-shield-bth500xx.hpp"
#include <math.h>

using namespace hss;

Bth500xxShield::Bth500xxShield(Hss* sw1, Hss* sw2, ADCPAL* vs, ADCPAL* vOut, ADCPAL* temp, BtxVariants_t* btxVariant1, BtxVariants_t* btxVariant2)
:
switches{sw1, sw2},
vs(vs),
vOut(vOut),
temp(temp),
btxVariant1(btxVariant1),
btxVariant2(btxVariant2) {

}

Bth500xxShield::~Bth500xxShield() {

}

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

    HSS_ASSERT_NULLPTR(btxVariant1);
    HSS_ASSERT_NULLPTR(btxVariant2);

    for (uint8_t i = 0; i < hssNum; i++) {
        HSS_ASSERT_NULLPTR(switches[i]);
        err = switches[i]->init();
        HSS_ASSERT_RET(err);
    }

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

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

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

    filterVs = new ExponentialFilter(0.0, 0.4);
    filterVOut = new ExponentialFilter(0.0, 0.4);
    filterTemp = new ExponentialFilter(0.0, 0.4);

    return err;
}

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

    for (uint8_t i = 0; i < hssNum; i++) {
        HSS_ASSERT_NULLPTR(switches[i]);
        err = switches[i]->deinit();
        HSS_ASSERT_RET(err);
    }

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

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

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

    return err;
}

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

    switch (x) {
        case 1:
            err = switches[0]->enable();
            HSS_ASSERT_RET(err);
            break;

        case 2:
            err = switches[1]->enable();
            HSS_ASSERT_RET(err);
            break;

        default:
            err = INVALID_CH_ERROR;
    }

    return err;
}

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

    switch (x) {
        case 1:
            err = switches[0]->disable();
            HSS_ASSERT_RET(err);
            break;

        case 2:
            err = switches[1]->disable();
            HSS_ASSERT_RET(err);
            break;

        default:
            err = INVALID_CH_ERROR;
    }

    return err;
}

DiagStatus_t Bth500xxShield::readDiagx(uint8_t x) {
    DiagStatus_t diagStatus = NORMAL;
    float senseCurrent = 0.0;
    float supplyVoltage = 0.0;
    float outputVoltage = 0.0;

    switch (x) {
        case 1:
            switches[0]->enableDiag();
            senseCurrent = switches[0]->readIs(2000) / btxVariant1->kilis;
            supplyVoltage = readVs();
            outputVoltage = readVOut();
            if(POWER_OFF == switches[0]->getSwitchStatus())
            {
                if(senseCurrent >= btxVariant1->iisFault)
                {
                    if(supplyVoltage == outputVoltage)
                    {
                        diagStatus = SHORT_TO_VSS;
                    }
                    else
                    {
                        diagStatus = OPEN_LOAD;
                    }
                }
            }
            else
            {
                if(senseCurrent >= btxVariant1->iisFault)
                {
                        diagStatus = SHORT_TO_GND_OR_OT;
                }
                else if(((senseCurrent <= 0.0000160) && (senseCurrent > 0.000001)) || (senseCurrent <= 0.000001))
                {
                    diagStatus = OPEN_LOAD;
                }
                else if((outputVoltage <= supplyVoltage) && (senseCurrent > 0.0000160))
                {
                    diagStatus = NORMAL;
                }
            }
            break;

        case 2:
            switches[1]->enableDiag();
            senseCurrent = switches[1]->readIs(2000) / btxVariant2->kilis;
            if(POWER_OFF == switches[1]->getSwitchStatus())
            {
                if(senseCurrent >= btxVariant2->iisFault)
                {
                   diagStatus = FAULT;
                }
            }
            else
            {
                if(senseCurrent >= btxVariant2->iisFault)
                {
                        diagStatus = SHORT_TO_GND_OR_OT;
                }
                else if(((senseCurrent <= 0.00000125) && (senseCurrent > 0.000001)) || (senseCurrent <= 0.000001))
                {
                    diagStatus = OPEN_LOAD;
                }
            }
            break;

        default:
            diagStatus = DIAG_READ_ERROR;
    }

    return diagStatus;
}

float Bth500xxShield::readIsx(uint8_t x) {
    float isCurrent = 0.0;

    switch (x) {
        case 1:
            switches[0]->enableDiag();
            isCurrent = switches[0]->readIs(2000);
            switches[0]->disableDiag();
            break;

        case 2:
            switches[1]->enableDiag();
            isCurrent = switches[1]->readIs(2000);
            switches[1]->disableDiag();
            break;

        default:
            isCurrent = -1.2345;    /* Invalid channel indicator */
    }

    return isCurrent;
}

Error_t Bth500xxShield::switchesHxOn(bool h1, bool h2) {
    Error_t err = OK;

    if (true == h1) {
        err = switches[0]->enable();
        HSS_ASSERT_RET(err);
    }

    if (true == h2) {
        err = switches[1]->enable();
        HSS_ASSERT_RET(err);
    }

    return err;
}

Error_t Bth500xxShield::switchesHxOff(bool h1, bool h2) {
    Error_t err = OK;

    if (true == h1) {
        err = switches[0]->disable();
        HSS_ASSERT_RET(err);
    }

    if (true == h2) {
        err = switches[1]->disable();
        HSS_ASSERT_RET(err);
    }

    return err;
}

float Bth500xxShield::readVs() {
    float supVol = 0.0;

    supVol = vs->ADCRead() * (5.0/1024.0) * ((5620.0 + 100000.0)/5620.0);
    filterVs->input(supVol);

    return filterVs->output();
}

float Bth500xxShield::readVOut() {
    float outVol = 0.0;

    outVol = vOut->ADCRead() * (5.0/1024.0) * ((5620.0 + 100000.0) / 5620.0);
    filterVOut->input(outVol);

    return filterVOut->output();
}

float Bth500xxShield::readTemperature() {
    float temperature = 0.0;
    float adcMeas = 0.0;
    float resisNTC = 0.0;

    if(nullptr != temp) {
    adcMeas = temp->ADCRead() * (5.0/1024.0);
    resisNTC = (75.0 * (readVs()/adcMeas)) - 75.0;
    temperature = (1.0/298.15) + ((1.0/3380.0) * log(resisNTC/10000.0));
    temperature = (1.0/temperature) - 273.15;

    filterTemp->input(temperature);

    return filterTemp->output();
    }

    else {
        return -35.43;
    }
}