Program Listing for File xensiv_pas_gas_r290_ino.cpp

Return to documentation for file (src/xensiv_pas_gas_r290_ino.cpp)

#include "xensiv_pas_gas_r290_ino.hpp"

#define GASINO_ASSERT_RET(x)                                                                                           \
    if (x != XENSIV_PAS_GAS_OK)                                                                                        \
    {                                                                                                                  \
        return x;                                                                                                      \
    }

Error_t XENSIV_PAS_GASR290Ino::getDeviceID(uint8_t &devID)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    ret = xensiv_pas_gas_r290_get_device_id(&dev, &devID);
    GASINO_ASSERT_RET(ret);

    return ret;
}

Error_t XENSIV_PAS_GASR290Ino::getAlarmConfig(bool &activeHigh)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    uint8_t regval = 0;

    ret = xensiv_pas_gas_get_reg(&dev, XENSIV_PAS_GAS_R290_REG_ALARM_CFG, &regval, 1U);
    GASINO_ASSERT_RET(ret);

    activeHigh = (regval & 0x01) ? true : false; // 0x00 = active low, 0x01 = active high
    return ret;
}

Error_t XENSIV_PAS_GASR290Ino::setABOCCycle(uint8_t days)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_r290_aboc_cycle_config_t abocCycle;

    if ((days < 7) || (days > 70))
    {
        return XENSIV_PAS_GAS_INVALID_PARAMETER;
    }

    abocCycle.b.aboc_cycle = days;

    ret = xensiv_pas_gas_r290_set_aboc_cycle(&dev, abocCycle);
    GASINO_ASSERT_RET(ret);

    return ret;
}

Error_t XENSIV_PAS_GASR290Ino::getABOCCycle(uint8_t &days)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_r290_aboc_cycle_config_t abocCycle;

    ret = xensiv_pas_gas_r290_get_aboc_cycle(&dev, &abocCycle);
    GASINO_ASSERT_RET(ret);

    days = abocCycle.b.aboc_cycle;
    return ret;
}

Error_t XENSIV_PAS_GASR290Ino::setABOCPrefill(uint8_t hours)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    // Get current ABOC cycle to determine max allowed value
    uint8_t aboc_cycle = 0;

    ret = getABOCCycle(aboc_cycle);
    GASINO_ASSERT_RET(ret);

    uint8_t max_hours = (aboc_cycle > 1) ? (aboc_cycle - 1) : 0;
    if (hours > max_hours)
    {
        hours = max_hours; // Cap at max allowed value
    }

    // Write to ABOC_PREFILL register
    ret = xensiv_pas_gas_set_reg(&dev, XENSIV_PAS_GAS_R290_REG_ABOC_PREFILL, &hours, 1U);
    GASINO_ASSERT_RET(ret);

    return ret;
}

Error_t XENSIV_PAS_GASR290Ino::setDenoiseConfig(uint8_t smoothing_factor)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_r290_denoise_config_t denoiseConfig;

    denoiseConfig.b.smoothing_factor = smoothing_factor;

    ret = xensiv_pas_gas_r290_set_denoise_config(&dev, denoiseConfig);

    GASINO_ASSERT_RET(ret);
    return ret;
}

Error_t XENSIV_PAS_GASR290Ino::getDenoiseConfig(uint8_t &smoothing_factor)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_r290_denoise_config_t denoiseConfig;

    ret = xensiv_pas_gas_r290_get_denoise_config(&dev, &denoiseConfig);

    GASINO_ASSERT_RET(ret);

    smoothing_factor = denoiseConfig.b.smoothing_factor;

    return ret;
}

String XENSIV_PAS_GASR290Ino::getSelfTestStatusString()
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_r290_self_test_t status;

    ret = xensiv_pas_gas_r290_get_self_test(&dev, &status);
    if (ret != XENSIV_PAS_GAS_OK)
    {
        return "Self-test read error";
    }

    String result = "";
    if (status.b.voltage_err)
        result += "Voltage error; ";
    if (status.b.temp_err)
        result += "Temperature error; ";
    if (status.b.simic_err)
        result += "Simic error; ";
    if (status.b.emitter_err)
        result += "Emitter error; ";
    if (status.b.aboc_drift_err)
        result += "ABOC drift error; ";
    if (status.b.lifetime_err)
        result += "Lifetime error; ";
    if (status.b.replace_s_en)
        result += "Replace sensor enabled; ";
    if (result.length() == 0)
        result = "Self-test passed: No errors.";
    return result;
}

Error_t XENSIV_PAS_GASR290Ino::selfTestErrorClear(bool clear)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_r290_self_test_clr_t clr = {0};
    if (clear)
    {
        clr.b.voltage_err_clr = 1;
        clr.b.temp_err_clr = 1;
        clr.b.simic_err_clr = 1;
        clr.b.emitter_err_clr = 1;
        clr.b.aboc_drift_err_clr = 1;
    }

    ret = xensiv_pas_gas_r290_clr_self_test(&dev, clr);
    GASINO_ASSERT_RET(ret);

    return ret;
}

XENSIV_PAS_GASR290Ino::~XENSIV_PAS_GASR290Ino() {}