diff --git a/cairquality.cpp b/cairquality.cpp index 7769da0..bb916d9 100644 --- a/cairquality.cpp +++ b/cairquality.cpp @@ -41,7 +41,7 @@ cAirQuality::~cAirQuality() air_quality_destroy(&m_airQuality); } -qint16 cAirQuality::collect() +qint32 cAirQuality::collect() { uint8_t iaq_index_acuracy; int32_t temperature; diff --git a/cairquality.h b/cairquality.h index 57f3196..6c6841e 100644 --- a/cairquality.h +++ b/cairquality.h @@ -43,7 +43,7 @@ public: cAirQuality(cTinkerForge* tinkerForge, const QString& uid, QObject* object = nullptr); ~cAirQuality(); - qint16 collect(); + qint32 collect(); QString uid(); qint32 lastError(); @@ -95,6 +95,8 @@ private: QString m_hardwareVersion; QString m_firmwareVersion; quint16 m_deviceIdentifier; + +signals: }; Q_DECLARE_METATYPE(cAirQuality*) diff --git a/cmainwindow.cpp b/cmainwindow.cpp index 3855c26..0fe307b 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -13,7 +13,7 @@ cMainWindow::cMainWindow(QWidget *parent) { ui->setupUi(this); - m_tinkerForge = new cTinkerForge("192.168.0.208", 4223); + m_tinkerForge = new cTinkerForge("192.168.0.101", 4223); m_airQuality = new cAirQuality(m_tinkerForge, "QqD"); m_outdoorWeather = new cOutdoorWeather(m_tinkerForge, "SwS", 84); diff --git a/cmasterbrick.cpp b/cmasterbrick.cpp new file mode 100644 index 0000000..64978cc --- /dev/null +++ b/cmasterbrick.cpp @@ -0,0 +1,229 @@ +#include "cmasterbrick.h" +#include "ctinkerforge.h" + + +cExtension::cExtension(const quint32& exttype, const QString& name) : + m_exttype(exttype), + m_name(name) +{ +} + +quint32 cExtension::exttype() +{ + return(m_exttype); +} + +QString cExtension::name() +{ + return(m_name); +} + +cExtension* cExtensionList::add(const quint32& exttype, const QString& name) +{ + cExtension* lpNew = find(exttype, name); + + if(!lpNew) + { + lpNew = new cExtension(exttype, name); + append(lpNew); + } + return(lpNew); +} + +cExtension* cExtensionList::find(const quint32& exttype, const QString& name) +{ + for(int x = 0;x < count();x++) + { + if(this->at(x)->exttype() == exttype && this->at(x)->name() == name) + return(this->at(x)); + } + return(nullptr); +} + +cExtension* cExtensionList::find(const quint32& exttype) +{ + for(int x = 0;x < count();x++) + { + if(this->at(x)->exttype() == exttype) + return(this->at(x)); + } + return(nullptr); +} + +cExtension* cExtensionList::find(const QString& name) +{ + for(int x = 0;x < count();x++) + { + if(this->at(x)->name() == name) + return(this->at(x)); + } + return(nullptr); +} + +cMasterBrick::cMasterBrick(cTinkerForge *tinkerForge, const QString &uid, QObject *parent) : + QObject(parent), + m_tinkerForge(tinkerForge), + m_uid(uid), + m_lastError(0) +{ + m_extensionList.add(1, "Chibi"); + m_extensionList.add(2, "RS485"); + m_extensionList.add(3, "WIFI"); + m_extensionList.add(4, "Ethernet"); + m_extensionList.add(5, "WIFI 2.0"); + + if(!m_tinkerForge) + return; + + master_create(&m_master, m_uid.toLocal8Bit().data(), m_tinkerForge->connection()); +} + +cMasterBrick::~cMasterBrick() +{ + master_destroy(&m_master); +} + +qint32 cMasterBrick::collect() +{ + uint8_t api_version[3]; + uint16_t voltage; + uint16_t current; + uint32_t debounce; + bool bricklets_enabled; + uint8_t communication_method; + uint32_t timeout_count; + bool enable_dynamic_baudrate; + uint32_t minimum_dynamic_baudrate; + char bricklet_port; + uint32_t baudrate; + + m_lastError = 0; + + if(master_get_api_version(&m_master, 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(master_get_stack_voltage(&m_master, &voltage) >= 0) + m_voltage = (double)voltage/100.0; + else + m_lastError |= VOLTAGE; + + if(master_get_stack_current(&m_master, ¤t) != 0) + m_current = (double)current/100.0; + else + m_lastError |= CURRENT; + + if(master_get_usb_voltage(&m_master, &voltage) >= 0) + m_usbVoltage = (double)voltage/100.0; + else + m_lastError |= USB_VOLTAGE; + + if(master_get_debounce_period(&m_master, &debounce) >= 0) + m_debouncePeriod = debounce; + else + m_lastError |= DEBOUNCE_PERIOD; + + if(master_get_bricklets_enabled(&m_master, &bricklets_enabled) >= 0) + m_brickletsEnabled = bricklets_enabled; + else + m_lastError |= BRICKLETS_ENABLED; + + for(communication_method = 0;communication_method < 8;communication_method++) + { + if(master_get_send_timeout_count(&m_master, communication_method, &timeout_count) >= 0) + m_timeoutCount[communication_method] = timeout_count; + else + { + m_lastError |= COMMUNICATION_METHOD; + m_lastError |= TIMEOUT_COUNT; + } + } + + if(master_get_spitfp_baudrate_config(&m_master, &enable_dynamic_baudrate, &minimum_dynamic_baudrate) >= 0) + { + m_enableDynamicBaudrate = enable_dynamic_baudrate; + m_minimumDynamicBaudrate = minimum_dynamic_baudrate; + } + else + { + m_lastError |= ENABLE_DYNAMIC_BAUDRATE; + m_lastError |= MINIMUM_DYNAMIC_BAUDRATE; + } + + for(bricklet_port = 0;bricklet_port < 5;bricklet_port++) + { + if(master_get_spitfp_baudrate(&m_master, bricklet_port, &baudrate) >= 0) + m_spitfpBaudrate[bricklet_port] = baudrate; + else + m_lastError |= SPITFP_BAUDRATE; + } + +//int master_get_spitfp_error_count(Master *master, char bricklet_port, uint32_t *ret_error_count_ack_checksum, uint32_t *ret_error_count_message_checksum, uint32_t *ret_error_count_frame, uint32_t *ret_error_count_overflow); +//int master_is_status_led_enabled(Master *master, bool *ret_enabled); +//int master_get_protocol1_bricklet_name(Master *master, char port, uint8_t *ret_protocol_version, uint8_t ret_firmware_version[3], char ret_name[40]); +//int master_get_chip_temperature(Master *master, int16_t *ret_temperature); +//int master_get_identity(Master *master, char ret_uid[8], char ret_connected_uid[8], char *ret_position, uint8_t ret_hardware_version[3], uint8_t ret_firmware_version[3], uint16_t *ret_device_identifier); + +//int master_is_chibi_present(Master *master, bool *ret_present); +//int master_get_chibi_address(Master *master, uint8_t *ret_address); +//int master_get_chibi_master_address(Master *master, uint8_t *ret_address); +//int master_get_chibi_slave_address(Master *master, uint8_t num, uint8_t *ret_address); +//int master_get_chibi_signal_strength(Master *master, uint8_t *ret_signal_strength); +//int master_get_chibi_error_log(Master *master, uint16_t *ret_underrun, uint16_t *ret_crc_error, uint16_t *ret_no_ack, uint16_t *ret_overflow); +//int master_get_chibi_frequency(Master *master, uint8_t *ret_frequency); +//int master_get_chibi_channel(Master *master, uint8_t *ret_channel); +//int master_is_rs485_present(Master *master, bool *ret_present); +//int master_get_rs485_address(Master *master, uint8_t *ret_address); +//int master_get_rs485_slave_address(Master *master, uint8_t num, uint8_t *ret_address); +//int master_get_rs485_error_log(Master *master, uint16_t *ret_crc_error); +//int master_get_rs485_configuration(Master *master, uint32_t *ret_speed, char *ret_parity, uint8_t *ret_stopbits); +//int master_is_wifi_present(Master *master, bool *ret_present); +//int master_get_wifi_configuration(Master *master, char ret_ssid[32], uint8_t *ret_connection, uint8_t ret_ip[4], uint8_t ret_subnet_mask[4], uint8_t ret_gateway[4], uint16_t *ret_port); +//int master_get_wifi_encryption(Master *master, uint8_t *ret_encryption, char ret_key[50], uint8_t *ret_key_index, uint8_t *ret_eap_options, uint16_t *ret_ca_certificate_length, uint16_t *ret_client_certificate_length, uint16_t *ret_private_key_length); +//int master_get_wifi_status(Master *master, uint8_t ret_mac_address[6], uint8_t ret_bssid[6], uint8_t *ret_channel, int16_t *ret_rssi, uint8_t ret_ip[4], uint8_t ret_subnet_mask[4], uint8_t ret_gateway[4], uint32_t *ret_rx_count, uint32_t *ret_tx_count, uint8_t *ret_state); +//int master_get_wifi_certificate(Master *master, uint16_t index, uint8_t ret_data[32], uint8_t *ret_data_length); +//int master_get_wifi_power_mode(Master *master, uint8_t *ret_mode); +//int master_get_wifi_buffer_info(Master *master, uint32_t *ret_overflow, uint16_t *ret_low_watermark, uint16_t *ret_used); +//int master_get_wifi_regulatory_domain(Master *master, uint8_t *ret_domain); +//int master_get_long_wifi_key(Master *master, char ret_key[64]); +//int master_get_wifi_hostname(Master *master, char ret_hostname[16]); +//int master_get_wifi_authentication_secret(Master *master, char ret_secret[64]); +//int master_is_ethernet_present(Master *master, bool *ret_present); +//int master_get_ethernet_configuration(Master *master, uint8_t *ret_connection, uint8_t ret_ip[4], uint8_t ret_subnet_mask[4], uint8_t ret_gateway[4], uint16_t *ret_port); +//int master_get_ethernet_status(Master *master, uint8_t ret_mac_address[6], uint8_t ret_ip[4], uint8_t ret_subnet_mask[4], uint8_t ret_gateway[4], uint32_t *ret_rx_count, uint32_t *ret_tx_count, char ret_hostname[32]); +//int master_get_ethernet_websocket_configuration(Master *master, uint8_t *ret_sockets, uint16_t *ret_port); +//int master_get_ethernet_authentication_secret(Master *master, char ret_secret[64]); +//int master_get_connection_type(Master *master, uint8_t *ret_connection_type); +//int master_is_wifi2_present(Master *master, bool *ret_present); +//int master_get_wifi2_authentication_secret(Master *master, char ret_secret[64]); +//int master_get_wifi2_configuration(Master *master, uint16_t *ret_port, uint16_t *ret_websocket_port, uint16_t *ret_website_port, uint8_t *ret_phy_mode, uint8_t *ret_sleep_mode, uint8_t *ret_website); +//int master_get_wifi2_status(Master *master, bool *ret_client_enabled, uint8_t *ret_client_status, uint8_t ret_client_ip[4], uint8_t ret_client_subnet_mask[4], uint8_t ret_client_gateway[4], uint8_t ret_client_mac_address[6], uint32_t *ret_client_rx_count, uint32_t *ret_client_tx_count, int8_t *ret_client_rssi, bool *ret_ap_enabled, uint8_t ret_ap_ip[4], uint8_t ret_ap_subnet_mask[4], uint8_t ret_ap_gateway[4], uint8_t ret_ap_mac_address[6], uint32_t *ret_ap_rx_count, uint32_t *ret_ap_tx_count, uint8_t *ret_ap_connected_count); +//int master_get_wifi2_client_configuration(Master *master, bool *ret_enable, char ret_ssid[32], uint8_t ret_ip[4], uint8_t ret_subnet_mask[4], uint8_t ret_gateway[4], uint8_t ret_mac_address[6], uint8_t ret_bssid[6]); +//int master_get_wifi2_client_hostname(Master *master, char ret_hostname[32]); +//int master_get_wifi2_client_password(Master *master, char ret_password[64]); +//int master_get_wifi2_ap_configuration(Master *master, bool *ret_enable, char ret_ssid[32], uint8_t ret_ip[4], uint8_t ret_subnet_mask[4], uint8_t ret_gateway[4], uint8_t *ret_encryption, bool *ret_hidden, uint8_t *ret_channel, uint8_t ret_mac_address[6]); +//int master_get_wifi2_ap_password(Master *master, char ret_password[64]); +//int master_get_wifi2_firmware_version(Master *master, uint8_t ret_firmware_version[3]); +//int master_is_wifi2_status_led_enabled(Master *master, bool *ret_enabled); +//int master_get_wifi2_mesh_configuration(Master *master, bool *ret_enable, uint8_t ret_root_ip[4], uint8_t ret_root_subnet_mask[4], uint8_t ret_root_gateway[4], uint8_t ret_router_bssid[6], uint8_t ret_group_id[6], char ret_group_ssid_prefix[16], uint8_t ret_gateway_ip[4], uint16_t *ret_gateway_port); +//int master_get_wifi2_mesh_router_ssid(Master *master, char ret_ssid[32]); +//int master_get_wifi2_mesh_router_password(Master *master, char ret_password[64]); +//int master_get_wifi2_mesh_common_status(Master *master, uint8_t *ret_status, bool *ret_root_node, bool *ret_root_candidate, uint16_t *ret_connected_nodes, uint32_t *ret_rx_count, uint32_t *ret_tx_count); +//int master_get_wifi2_mesh_client_status(Master *master, char ret_hostname[32], uint8_t ret_ip[4], uint8_t ret_subnet_mask[4], uint8_t ret_gateway[4], uint8_t ret_mac_address[6]); +//int master_get_wifi2_mesh_ap_status(Master *master, char ret_ssid[32], uint8_t ret_ip[4], uint8_t ret_subnet_mask[4], uint8_t ret_gateway[4], uint8_t ret_mac_address[6]); + +//int master_get_extension_type(Master *master, uint8_t extension, uint32_t *ret_exttype); + + return(m_lastError); +} + +QString cMasterBrick::uid() +{ + return(m_uid); +} + +qint32 cMasterBrick::lastError() +{ + return(m_lastError); +} diff --git a/cmasterbrick.h b/cmasterbrick.h new file mode 100644 index 0000000..300e5ad --- /dev/null +++ b/cmasterbrick.h @@ -0,0 +1,93 @@ +#ifndef CMASTERBRICK_H +#define CMASTERBRICK_H + + +#include "tinkerforge/brick_master.h" + +#include + +#include +#include + + +class cTinkerForge; + + +class cExtension +{ +public: + cExtension(const quint32& exttype, const QString& name); + + quint32 exttype(); + QString name(); + +private: + quint32 m_exttype; + QString m_name; +}; + +class cExtensionList : public QList +{ +public: + cExtension* add(const quint32& exttype, const QString& name); + cExtension* find(const quint32& exttype); + cExtension* find(const quint32& exttype, const QString& name); + cExtension* find(const QString& name); +}; + +Q_DECLARE_METATYPE(cExtension*) + +class cMasterBrick : public QObject +{ + Q_OBJECT + +public: + enum errorCode + { + API_VERSION = 0x00000001, + VOLTAGE = 0x00000002, + CURRENT = 0x00000004, + USB_VOLTAGE = 0x00000008, + DEBOUNCE_PERIOD = 0x00000010, + BRICKLETS_ENABLED = 0x00000020, + COMMUNICATION_METHOD = 0x00000040, + TIMEOUT_COUNT = 0x00000080, + ENABLE_DYNAMIC_BAUDRATE = 0x00000100, + MINIMUM_DYNAMIC_BAUDRATE = 0x00000200, + SPITFP_BAUDRATE = 0x00000400, + }; + + cMasterBrick(cTinkerForge* tinkerForge, const QString& uid, QObject *parent = nullptr); + ~cMasterBrick(); + + qint32 collect(); + + QString uid(); + qint32 lastError(); + +private: + cTinkerForge* m_tinkerForge; + cExtensionList m_extensionList; + + QString m_uid; + qint32 m_lastError; + Master m_master; + + QString m_apiVersion; + double m_voltage; + double m_current; + double m_usbVoltage; + quint32 m_debouncePeriod; + bool m_brickletsEnabled; + quint32 m_timeoutCount[8]; + bool m_enableDynamicBaudrate; + bool m_minimumDynamicBaudrate; + quint32 m_spitfpBaudrate[4]; + +signals: + +}; + +Q_DECLARE_METATYPE(cMasterBrick*) + +#endif // CMASTERBRICK_H diff --git a/weatherStation.pro b/weatherStation.pro index 6ed1a71..39064df 100644 --- a/weatherStation.pro +++ b/weatherStation.pro @@ -11,6 +11,7 @@ CONFIG += c++11 SOURCES += \ cairquality.cpp \ cdisplayvalues.cpp \ + cmasterbrick.cpp \ coutdoorweather.cpp \ ctinkerforge.cpp \ main.cpp \ @@ -24,6 +25,7 @@ HEADERS += \ cairquality.h \ cdisplayvalues.h \ cmainwindow.h \ + cmasterbrick.h \ coutdoorweather.h \ ctinkerforge.h \ tinkerforge/brick_master.h \