You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
284 lines
6.1 KiB
C++
284 lines
6.1 KiB
C++
#include "cairquality.h"
|
|
#include "ctinkerforge.h"
|
|
|
|
|
|
cAirQuality::cAirQuality(cTinkerForge* tinkerForge, const QString& uid, QObject *object) :
|
|
QObject(object),
|
|
m_tinkerForge(tinkerForge),
|
|
m_uid(uid),
|
|
m_lastError(0),
|
|
m_iaqIndex(0),
|
|
m_temperature(0.0),
|
|
m_humidity(0.0),
|
|
m_airPressure(0.0),
|
|
m_iaqIndexAccuracy(""),
|
|
m_apiVersion(""),
|
|
m_temperatureOffset(0.0),
|
|
m_backgroundCalibrationDuration(0),
|
|
m_errorCountAckChecksum(0),
|
|
m_errorCountMessageChecksum(0),
|
|
m_errorCountFrame(0),
|
|
m_errorCountOverflow(0),
|
|
m_bootloaderMode(0),
|
|
m_statusLEDConfig(0),
|
|
m_chipTemperature(0.0),
|
|
m_uid1(""),
|
|
m_connectedUID(""),
|
|
m_position(""),
|
|
m_hardwareVersion(""),
|
|
m_firmwareVersion(""),
|
|
m_deviceIdentifier(0)
|
|
{
|
|
if(!m_tinkerForge)
|
|
return;
|
|
|
|
air_quality_create(&m_airQuality, m_uid.toLocal8Bit().data(), m_tinkerForge->connection());
|
|
tinkerForge->add(this);
|
|
}
|
|
|
|
cAirQuality::~cAirQuality()
|
|
{
|
|
air_quality_destroy(&m_airQuality);
|
|
}
|
|
|
|
qint32 cAirQuality::collect()
|
|
{
|
|
uint8_t iaq_index_acuracy;
|
|
int32_t temperature;
|
|
int32_t humidity;
|
|
int32_t air_pressure;
|
|
uint8_t api_version[3];
|
|
int32_t offset;
|
|
uint8_t duration;
|
|
uint32_t error_count_ack_checksum;
|
|
uint32_t error_count_message_checksum;
|
|
uint32_t error_count_frame;
|
|
uint32_t error_count_overflow;
|
|
uint8_t mode;
|
|
uint8_t config;
|
|
int16_t chip_temperature;
|
|
char uid[8];
|
|
char connected_uid[8];
|
|
char position;
|
|
uint8_t hardware_version[3];
|
|
uint8_t firmware_version[3];
|
|
uint16_t device_identifier;
|
|
|
|
m_lastError = 0;
|
|
|
|
if(air_quality_get_all_values(&m_airQuality, &m_iaqIndex, &iaq_index_acuracy, &temperature, &humidity, &air_pressure) >= 0)
|
|
{
|
|
switch(iaq_index_acuracy)
|
|
{
|
|
case AIR_QUALITY_ACCURACY_UNRELIABLE:
|
|
m_iaqIndexAccuracy = "Unreliable";
|
|
break;
|
|
case AIR_QUALITY_ACCURACY_LOW:
|
|
m_iaqIndexAccuracy = "Low";
|
|
break;
|
|
case AIR_QUALITY_ACCURACY_MEDIUM:
|
|
m_iaqIndexAccuracy = "Medium";
|
|
break;
|
|
case AIR_QUALITY_ACCURACY_HIGH:
|
|
m_iaqIndexAccuracy = "High";
|
|
break;
|
|
default:
|
|
m_iaqIndexAccuracy = "Unreliable";
|
|
break;
|
|
}
|
|
|
|
m_temperature = (double)temperature / 100.0;
|
|
m_humidity = (double)humidity / 100.0;
|
|
m_airPressure = (double)air_pressure / 100.0;
|
|
}
|
|
else
|
|
{
|
|
m_lastError |= IAQ_INDEX;
|
|
m_lastError |= IAQ_INDEX_ACURACY;
|
|
m_lastError |= TEMPERATURE;
|
|
m_lastError |= HUMIDITY;
|
|
m_lastError |= AIR_PRESSURE;
|
|
}
|
|
|
|
if(air_quality_get_api_version(&m_airQuality, api_version) >= 0)
|
|
m_apiVersion = QString("%1.%2.%3").arg(api_version[0]).arg(api_version[1]).arg(api_version[2]);
|
|
else
|
|
m_lastError |= API_VERSION;
|
|
|
|
if(air_quality_get_temperature_offset(&m_airQuality, &offset) >= 0)
|
|
m_temperatureOffset = (double)offset/(100.0);
|
|
else
|
|
m_lastError |= TEMPERATURE_OFFSET;
|
|
|
|
if(air_quality_get_background_calibration_duration(&m_airQuality, &duration) >= 0)
|
|
m_backgroundCalibrationDuration = duration;
|
|
else
|
|
m_lastError |= BACKGROUND_CALIBRATION_DURATION;
|
|
|
|
if(air_quality_get_spitfp_error_count(&m_airQuality, &error_count_ack_checksum, &error_count_message_checksum, &error_count_frame, &error_count_overflow) >= 0)
|
|
{
|
|
m_errorCountAckChecksum = error_count_ack_checksum;
|
|
m_errorCountMessageChecksum = error_count_message_checksum;
|
|
m_errorCountFrame = error_count_frame;
|
|
m_errorCountOverflow = error_count_overflow;
|
|
}
|
|
else
|
|
{
|
|
m_lastError |= ERROR_COUNT_ACK_CHECKSUM;
|
|
m_lastError |= ERROR_COUNT_MESSAGE_CHECKSUM;
|
|
m_lastError |= ERROR_COUNT_FRAME;
|
|
m_lastError |= ERROR_COUNT_OVERFLOW;
|
|
}
|
|
|
|
if(air_quality_get_bootloader_mode(&m_airQuality, &mode) >= 0)
|
|
m_bootloaderMode = mode;
|
|
else
|
|
m_lastError |= BOOTLOADER_MODE;
|
|
|
|
if(air_quality_get_status_led_config(&m_airQuality, &config) >= 0)
|
|
m_statusLEDConfig = config;
|
|
else
|
|
m_lastError |= STATUS_LED_CONFIG;
|
|
|
|
if(air_quality_get_chip_temperature(&m_airQuality, &chip_temperature) >= 0)
|
|
m_chipTemperature = (double)chip_temperature;
|
|
else
|
|
m_lastError |= CHIP_TEMPERATURE;
|
|
|
|
if(air_quality_get_identity(&m_airQuality, uid, connected_uid, &position, hardware_version, firmware_version, &device_identifier) >= 0)
|
|
{
|
|
m_uid1 = QString(uid);
|
|
m_connectedUID = QString(connected_uid);
|
|
m_position = QString(position);
|
|
m_hardwareVersion = QString("%1.%2.%3").arg(hardware_version[0]).arg(hardware_version[1]).arg(hardware_version[2]);
|
|
m_firmwareVersion = QString("%1.%2.%3").arg(firmware_version[0]).arg(firmware_version[1]).arg(firmware_version[2]);
|
|
m_deviceIdentifier = device_identifier;
|
|
}
|
|
else
|
|
{
|
|
m_lastError |= UID;
|
|
m_lastError |= CONNECTED_UID;
|
|
m_lastError |= POSITION;
|
|
m_lastError |= HARDWARE_VERSION;
|
|
m_lastError |= FIRMWARE_VERSION;
|
|
m_lastError |= DEVICE_IDENTIFIER;
|
|
}
|
|
|
|
return(m_lastError);
|
|
}
|
|
|
|
QString cAirQuality::uid()
|
|
{
|
|
return(m_uid);
|
|
}
|
|
|
|
qint32 cAirQuality::lastError()
|
|
{
|
|
return(m_lastError);
|
|
}
|
|
|
|
qint32 cAirQuality::iaqIndex()
|
|
{
|
|
return(m_iaqIndex);
|
|
}
|
|
|
|
double cAirQuality::temperature()
|
|
{
|
|
return(m_temperature);
|
|
}
|
|
|
|
double cAirQuality::humidity()
|
|
{
|
|
return(m_humidity);
|
|
}
|
|
|
|
double cAirQuality::airPressure()
|
|
{
|
|
return(m_airPressure);
|
|
}
|
|
|
|
QString cAirQuality::iaqIndexAccuracy()
|
|
{
|
|
return(m_iaqIndexAccuracy);
|
|
}
|
|
|
|
QString cAirQuality::apiVersion()
|
|
{
|
|
return(m_apiVersion);
|
|
}
|
|
|
|
double cAirQuality::temperatureOffset()
|
|
{
|
|
return(m_temperatureOffset);
|
|
}
|
|
|
|
quint8 cAirQuality::backgroundCalibrationDuration()
|
|
{
|
|
return(m_backgroundCalibrationDuration);
|
|
}
|
|
|
|
quint32 cAirQuality::errorCountAckChecksum()
|
|
{
|
|
return(m_errorCountAckChecksum);
|
|
}
|
|
|
|
quint32 cAirQuality::errorCountMessageChecksum()
|
|
{
|
|
return(m_errorCountMessageChecksum);
|
|
}
|
|
|
|
quint32 cAirQuality::errorCountFrame()
|
|
{
|
|
return(m_errorCountFrame);
|
|
}
|
|
|
|
quint32 cAirQuality::errorCountOverflow()
|
|
{
|
|
return(m_errorCountOverflow);
|
|
}
|
|
|
|
quint8 cAirQuality::bootloaderMode()
|
|
{
|
|
return(m_bootloaderMode);
|
|
}
|
|
|
|
quint8 cAirQuality::statusLEDConfig()
|
|
{
|
|
return(m_statusLEDConfig);
|
|
}
|
|
|
|
double cAirQuality::chipTemperature()
|
|
{
|
|
return(m_chipTemperature);
|
|
}
|
|
|
|
QString cAirQuality::uid1()
|
|
{
|
|
return(m_uid1);
|
|
}
|
|
|
|
QString cAirQuality::connectedUID()
|
|
{
|
|
return(m_connectedUID);
|
|
}
|
|
|
|
QString cAirQuality::position()
|
|
{
|
|
return(m_position);
|
|
}
|
|
|
|
QString cAirQuality::hardwareVersion()
|
|
{
|
|
return(m_hardwareVersion);
|
|
}
|
|
|
|
QString cAirQuality::firmwareVersion()
|
|
{
|
|
return(m_firmwareVersion);
|
|
}
|
|
|
|
quint16 cAirQuality::deviceIdentifier()
|
|
{
|
|
return(m_deviceIdentifier);
|
|
}
|