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, ®val, 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() {}