Program Listing for File xensiv_pas_gas_a2l_ino.cpp

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

#include "xensiv_pas_gas_a2l_ino.hpp"

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

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

    return ret;
}

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

    ret = xensiv_pas_gas_get_reg(&dev, XENSIV_PAS_GAS_A2L_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_GASA2LIno::setABOCCycle(uint8_t days)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_a2l_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_a2l_set_aboc_cycle(&dev, abocCycle);
    GASINO_ASSERT_RET(ret);

    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::getABOCCycle(uint8_t &days)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_a2l_aboc_cycle_config_t abocCycle;

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

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

Error_t XENSIV_PAS_GASA2LIno::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_A2L_REG_ABOC_PREFILL, &hours, 1U);
    GASINO_ASSERT_RET(ret);

    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::setDenoiseConfig(uint8_t smoothing_factor)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_a2l_denoise_config_t denoiseConfig;

    denoiseConfig.b.smoothing_factor = smoothing_factor;

    ret = xensiv_pas_gas_a2l_set_denoise_config(&dev, denoiseConfig);

    GASINO_ASSERT_RET(ret);
    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::getDenoiseConfig(uint8_t &smoothing_factor)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_a2l_denoise_config_t denoiseConfig;

    ret = xensiv_pas_gas_a2l_get_denoise_config(&dev, &denoiseConfig);

    GASINO_ASSERT_RET(ret);

    smoothing_factor = denoiseConfig.b.smoothing_factor;

    return ret;
}

String XENSIV_PAS_GASA2LIno::getSelfTestStatusString()
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_a2l_self_test_t status;

    ret = xensiv_pas_gas_a2l_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_GASA2LIno::selfTestErrorClear(bool clear)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_a2l_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_a2l_clr_self_test(&dev, clr);
    GASINO_ASSERT_RET(ret);

    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::setAlarmHysteresis(uint16_t alarm_hys)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    if (alarm_hys > XENSIV_PAS_GAS_A2L_ALARM_HYS_MAX)
    {
        return XENSIV_PAS_GAS_INVALID_PARAMETER;
    }
    ret = xensiv_pas_gas_a2l_set_alarm_hysteresis(&dev, alarm_hys);

    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::getAlarmHysteresis(uint16_t &alarm_hys)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    ret = xensiv_pas_gas_a2l_get_alarm_hysteresis(&dev, &alarm_hys);

    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::getAbsoluteHumidityRef(uint16_t &abs_humidity)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    ret = xensiv_pas_gas_a2l_get_absolute_humidity_ref(&dev, &abs_humidity);

    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::setAbsoluteHumidityRef(uint16_t abs_humidity)
{
    int32_t ret = XENSIV_PAS_GAS_OK;
    ret = xensiv_pas_gas_a2l_set_absolute_humidity_ref(&dev, abs_humidity);

    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::enableHumidityCompensation(bool enable)
{

    int32_t ret = XENSIV_PAS_GAS_OK;
    xensiv_pas_gas_a2l_humidity_control_t humidityControl;

    humidityControl.b.hc_enable = enable;

    ret = xensiv_pas_gas_a2l_set_humidity_control(&dev, humidityControl);

    return ret;
}

Error_t XENSIV_PAS_GASA2LIno::isHumidityCompensationEnabled(bool enable)
{
    xensiv_pas_gas_a2l_humidity_control_t hc_ctrl = {0};
    int32_t ret = xensiv_pas_gas_a2l_get_humidity_control(&dev, &hc_ctrl);
    if (ret != XENSIV_PAS_GAS_OK)
    {
        enable = false;
        return ret;
    }
    enable = hc_ctrl.b.hc_enable;
    return XENSIV_PAS_GAS_OK;
}

Error_t XENSIV_PAS_GASA2LIno::setGasSelection(xensiv_pas_gas_a2l_gas_selection_t gas)
{
    xensiv_pas_gas_a2l_gas_config_t gas_cfg = {0};

    int32_t ret = xensiv_pas_gas_a2l_get_gas_config(&dev, &gas_cfg);
    if (ret != XENSIV_PAS_GAS_OK)
        return ret;

    gas_cfg.b.gas_select = (uint8_t)gas;

    return xensiv_pas_gas_a2l_set_gas_config(&dev, gas_cfg);
}

Error_t XENSIV_PAS_GASA2LIno::getGasSelection(xensiv_pas_gas_a2l_gas_selection_t &gas)
{
    return xensiv_pas_gas_a2l_get_gas_selection(&dev, &gas);
}

Error_t XENSIV_PAS_GASA2LIno::getAvailableGases(uint8_t &gas_avail)
{
    return xensiv_pas_gas_a2l_get_available_gases(&dev, &gas_avail);
}

XENSIV_PAS_GASA2LIno::~XENSIV_PAS_GASA2LIno() {}