From 548617c183c0c368c22637dd4af6b82f80bec11b Mon Sep 17 00:00:00 2001 From: imi415 Date: Sun, 25 Jul 2021 23:22:04 +0800 Subject: [PATCH] Multiple bugfixes. --- CMakeLists.txt | 3 +- include/impl/user_bme280_impl.h | 2 + include/tasks/user_task_mqtt_common.h | 8 ++ include/utils/user_log_util.h | 5 +- lib/CMakeLists.txt | 1 + lib/bme280_dht/bme280_dht.c | 104 ++++++++++++++------------ lib/bme280_dht/bme280_dht.h | 37 ++++----- lib/mqtt_influx/mqtt_influx.c | 6 ++ misc/agent_config.cfg.example | 2 +- misc/agent_config.cfg.pine64 | 9 ++- misc/agent_config.cfg.rpi4 | 3 +- src/drivers/user_config_driver.c | 12 ++- src/drivers/user_gpio_driver.c | 2 +- src/impl/user_bme280_impl.c | 10 +++ src/impl/user_lvgl_impl.c | 6 +- src/impl/user_mqtt_impl.c | 6 +- src/impl/user_st7789_impl.c | 2 +- src/impl/user_stick_impl.c | 2 +- src/main.c | 1 - src/tasks/user_base_task.c | 2 + src/tasks/user_clock_task.c | 2 + src/tasks/user_dht_task.c | 26 +++++-- src/tasks/user_lvgl_task.c | 2 + src/tasks/user_mqtt_task.c | 12 +-- src/tasks/user_tvoc_task.c | 4 + src/utils/user_log_util.c | 2 +- 26 files changed, 176 insertions(+), 95 deletions(-) create mode 100644 include/tasks/user_task_mqtt_common.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7aeca75..ca4a341 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,4 +67,5 @@ add_executable(${CMAKE_PROJECT_NAME} ${C_SOURCES}) target_link_libraries(${CMAKE_PROJECT_NAME} ${C_LIBRARIES}) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE ${C_DEFINES}) target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${C_INCLUDES}) -target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-pthread") \ No newline at end of file +target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-pthread") +target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wall" "-Wextra" "-Wno-unused") \ No newline at end of file diff --git a/include/impl/user_bme280_impl.h b/include/impl/user_bme280_impl.h index efc514d..0207b67 100644 --- a/include/impl/user_bme280_impl.h +++ b/include/impl/user_bme280_impl.h @@ -21,4 +21,6 @@ bme280_ret_t user_bme280_impl_read_register_cb(user_bme280_impl_t *impl, bme280_ret_t user_bme280_impl_write_register_cb(user_bme280_impl_t *impl, uint8_t reg, uint8_t data); +bme280_ret_t user_bme280_impl_delay_cb(user_bme280_impl_t *impl, uint32_t delay_ms); + #endif \ No newline at end of file diff --git a/include/tasks/user_task_mqtt_common.h b/include/tasks/user_task_mqtt_common.h new file mode 100644 index 0000000..896311f --- /dev/null +++ b/include/tasks/user_task_mqtt_common.h @@ -0,0 +1,8 @@ +#ifndef USER_TASK_MQTT_COMMON_H +#define USER_TASK_MQTT_COMMON_H + +#include "mqtt_influx.h" + +extern mqtt_influx_t g_mqtt_influx; + +#endif \ No newline at end of file diff --git a/include/utils/user_log_util.h b/include/utils/user_log_util.h index 8d543d3..531ca9f 100644 --- a/include/utils/user_log_util.h +++ b/include/utils/user_log_util.h @@ -1,6 +1,8 @@ #ifndef __USER_LOG_UTIL_H #define __USER_LOG_UTIL_H +#include + typedef enum { USER_LOG_DEBUG = 1, USER_LOG_INFO, @@ -9,7 +11,8 @@ typedef enum { USER_LOG_FATAL } user_log_level_t; -#define USER_LOG(level, fmt, ...) user_log_print(level, "["__FILE__ ":%d] " fmt, __LINE__, ##__VA_ARGS__) +#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#define USER_LOG(level, fmt, ...) user_log_print(level, "[%s:%d] " fmt, __FILENAME__, __LINE__, ##__VA_ARGS__) void user_log_set_level(user_log_level_t level); void user_log_print(user_log_level_t level, char *fmt, ...); diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 9847abc..f32de0a 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -25,6 +25,7 @@ set(BME280_DHT_SOURCES add_library(bme280 STATIC ${BME280_DHT_SOURCES}) target_compile_definitions(bme280 PRIVATE ${BME280_DHT_DEFINES}) +target_compile_options(bme280 PRIVATE "-Wall" "-Wextra" "-Wno-unused") set(CCS811_TVOC_SOURCES "ccs811_tvoc/ccs811_tvoc.c" diff --git a/lib/bme280_dht/bme280_dht.c b/lib/bme280_dht/bme280_dht.c index b0378cd..801aacb 100644 --- a/lib/bme280_dht/bme280_dht.c +++ b/lib/bme280_dht/bme280_dht.c @@ -1,49 +1,53 @@ #include #include -#include -#include -#include -#include - #include "bme280_dht.h" +#define BME280_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb) + bme280_ret_t _bme280_read_trim_data(bme280_t *bme); double _bme280_compensate_T(bme280_t *bme, int32_t adc_T); double _bme280_compensate_P(bme280_t *bme, int32_t adc_P); double _bme280_compensate_H(bme280_t *bme, int32_t adc_H); +static bme280_ret_t _bme280_reset(bme280_t *bme) { + return bme->cb.write_register_cb(bme->user_data, 0xE0, 0xB6); +} + bme280_ret_t bme280_init(bme280_t *bme) { if(!bme) return BME_FAIL; + if(_bme280_reset(bme) == BME_FAIL) return BME_FAIL; + bme->cb.delay_cb(bme->user_data, 100); if(_bme280_read_trim_data(bme) == BME_FAIL) return BME_FAIL; return BME_OK; } -bme280_ret_t bme280_preset_config(bme280_config_t *config, bme280_mode_preset_t preset) { +bme280_ret_t bme280_preset_config(bme280_config_t *config, + bme280_mode_preset_t preset) { switch(preset) { - case BME_PRESET_WEATHER: + case BME_PRESET_WEATHER: config->mode = BME_MODE_FORCED; config->osrs_t = BME_OS_1; config->osrs_p = BME_OS_1; config->osrs_h = BME_OS_1; config->filter = BME_FILTER_OFF; break; - case BME_PRESET_HUMIDITY: + case BME_PRESET_HUMIDITY: config->mode = BME_MODE_FORCED; config->osrs_t = BME_OS_1; config->osrs_p = BME_OS_SKIP; config->osrs_h = BME_OS_1; config->filter = BME_FILTER_OFF; break; - case BME_PRESET_INDOOR_NAV: + case BME_PRESET_INDOOR_NAV: config->mode = BME_MODE_NORMAL; config->osrs_t = BME_OS_2; config->osrs_p = BME_OS_16; config->osrs_h = BME_OS_1; config->filter = BME_FILTER_16; break; - case BME_PRESET_GAMING: + case BME_PRESET_GAMING: config->mode = BME_MODE_NORMAL; config->osrs_t = BME_OS_1; config->osrs_p = BME_OS_4; @@ -56,11 +60,12 @@ bme280_ret_t bme280_preset_config(bme280_config_t *config, bme280_mode_preset_t bme280_ret_t bme280_apply_config(bme280_t *bme, bme280_config_t *config) { uint8_t reg_config = config->filter << 0x02; - uint8_t reg_ctrl_measure = (config->osrs_t << 0x05) | (config->osrs_p << 0x02) | config->mode; + uint8_t reg_ctrl_measure = + (uint8_t)((config->osrs_t << 0x05) | (config->osrs_p << 0x02) | config->mode); uint8_t reg_ctrl_hum = config->osrs_h; bme->cb.write_register_cb(bme->user_data, 0xF5, reg_config); - bme->cb.write_register_cb(bme->user_data, 0xF4, reg_ctrl_measure); bme->cb.write_register_cb(bme->user_data, 0xF2, reg_ctrl_hum); + bme->cb.write_register_cb(bme->user_data, 0xF4, reg_ctrl_measure); return BME_OK; } @@ -73,17 +78,18 @@ bme280_ret_t bme280_measure(bme280_t *bme, bme280_result_t *result) { uint8_t ctrl_meas; uint8_t loop_count = 0; bme->cb.read_register_cb(bme->user_data, 0xF4, &ctrl_meas, 0x01); - bme->cb.write_register_cb(bme->user_data, 0xF4, ctrl_meas | BME_MODE_FORCED); + bme->cb.write_register_cb(bme->user_data, 0xF4, + ctrl_meas | BME_MODE_FORCED); do { bme->cb.read_register_cb(bme->user_data, 0xF3, &status, 0x01); loop_count++; - usleep(100 * 1000); + bme->cb.delay_cb(bme->user_data, 100); } while(status & 0x08 && (loop_count < 12)); bme->cb.read_register_cb(bme->user_data, 0xF7, measure_data, 0x08); - raw_P = measure_data[0] << 12 | measure_data[1] << 0x04 | measure_data[2]; - raw_T = measure_data[3] << 12 | measure_data[4] << 0x04 | measure_data[5]; - raw_H = measure_data[6] << 8 | measure_data[7]; + raw_P = ((uint32_t)measure_data[0] << 12) | ((uint32_t)measure_data[1] << 0x04) | ((uint32_t)measure_data[2] >> 0x04); + raw_T = ((uint32_t)measure_data[3] << 12) | ((uint32_t)measure_data[4] << 0x04) | ((uint32_t)measure_data[5] >> 0x04); + raw_H = ((uint32_t)measure_data[6] << 8) | ((uint32_t)measure_data[7]); result->temperature = _bme280_compensate_T(bme, raw_T); result->pressure = _bme280_compensate_P(bme, raw_P); result->humidity = _bme280_compensate_H(bme, raw_H); @@ -95,51 +101,51 @@ bme280_ret_t _bme280_read_trim_data(bme280_t *bme) { uint8_t rx_buf[2]; ret = bme->cb.read_register_cb(bme->user_data, 0x88, rx_buf, 0x02); // T1 if(ret == BME_FAIL) return ret; - bme->trim.dig_T1 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_T1 = BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x8A, rx_buf, 0x02); // T2 if(ret == BME_FAIL) return ret; - bme->trim.dig_T2 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_T2 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x8C, rx_buf, 0x02); // T3 if(ret == BME_FAIL) return ret; - bme->trim.dig_T3 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_T3 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x8E, rx_buf, 0x02); // P1 if(ret == BME_FAIL) return ret; - bme->trim.dig_P1 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P1 = BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x90, rx_buf, 0x02); // P2 if(ret == BME_FAIL) return ret; - bme->trim.dig_P2 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P2 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x92, rx_buf, 0x02); // P3 if(ret == BME_FAIL) return ret; - bme->trim.dig_P3 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P3 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x94, rx_buf, 0x02); // P4 if(ret == BME_FAIL) return ret; - bme->trim.dig_P4 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P4 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x96, rx_buf, 0x02); // P5 if(ret == BME_FAIL) return ret; - bme->trim.dig_P5 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P5 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x98, rx_buf, 0x02); // P5 if(ret == BME_FAIL) return ret; - bme->trim.dig_P6 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P6 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x9A, rx_buf, 0x02); // P7 if(ret == BME_FAIL) return ret; - bme->trim.dig_P7 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P7 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x9C, rx_buf, 0x02); // P8 if(ret == BME_FAIL) return ret; - bme->trim.dig_P8 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P8 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0x9E, rx_buf, 0x02); // P9 if(ret == BME_FAIL) return ret; - bme->trim.dig_P9 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_P9 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0xA1, rx_buf, 0x01); // H1 if(ret == BME_FAIL) return ret; @@ -147,32 +153,34 @@ bme280_ret_t _bme280_read_trim_data(bme280_t *bme) { ret = bme->cb.read_register_cb(bme->user_data, 0xE1, rx_buf, 0x02); // H2 if(ret == BME_FAIL) return ret; - bme->trim.dig_H2 = rx_buf[1] << 0x08 | rx_buf[0]; + bme->trim.dig_H2 = (int16_t)BME280_CONCAT_BYTES(rx_buf[1], rx_buf[0]); ret = bme->cb.read_register_cb(bme->user_data, 0xE3, rx_buf, 0x01); // H3 if(ret == BME_FAIL) return ret; - bme->trim.dig_H3 = rx_buf[0]; + bme->trim.dig_H3 = (uint8_t)rx_buf[0]; ret = bme->cb.read_register_cb(bme->user_data, 0xE4, rx_buf, 0x02); // H4 if(ret == BME_FAIL) return ret; - bme->trim.dig_H4 = (rx_buf[0] << 0x04) | (rx_buf[1] & 0x0F); + bme->trim.dig_H4 = (int16_t)(((int8_t)rx_buf[0] << 0x04) | (rx_buf[1] & 0x0F)); ret = bme->cb.read_register_cb(bme->user_data, 0xE5, rx_buf, 0x02); // H5 if(ret == BME_FAIL) return ret; - bme->trim.dig_H5 = (rx_buf[1] << 0x04) | (rx_buf[0] >> 0x04); + bme->trim.dig_H5 = (int16_t)(((int8_t)rx_buf[1] << 0x04) | (rx_buf[0] >> 0x04)); ret = bme->cb.read_register_cb(bme->user_data, 0xE7, rx_buf, 0x01); // H6 if(ret == BME_FAIL) return ret; - bme->trim.dig_H6 = rx_buf[0]; + bme->trim.dig_H6 = (int8_t)rx_buf[0]; return BME_OK; } double _bme280_compensate_T(bme280_t *bme, int32_t adc_T) { double var1, var2, T; - var1 = (((double)adc_T) / 16384.0 - ((double)bme->trim.dig_T1) / 1024.0) * ((double)bme->trim.dig_T2); - var2 = ((((double)adc_T) / 131072.0 - ((double)bme->trim.dig_T1) / 8192.0) * - (((double)adc_T) / 131072.0 - ((double)bme->trim.dig_T1) / 8192.0)) * - ((double)bme->trim.dig_T3); + var1 = (((double)adc_T) / 16384.0 - ((double)bme->trim.dig_T1) / 1024.0) * + ((double)bme->trim.dig_T2); + var2 = + ((((double)adc_T) / 131072.0 - ((double)bme->trim.dig_T1) / 8192.0) * + (((double)adc_T) / 131072.0 - ((double)bme->trim.dig_T1) / 8192.0)) * + ((double)bme->trim.dig_T3); bme->t_fine = (int32_t)(var1 + var2); T = (var1 + var2) / 5120.0; return T; @@ -184,10 +192,11 @@ double _bme280_compensate_P(bme280_t *bme, int32_t adc_P) { var2 = var1 * var1 * ((double)bme->trim.dig_P6) / 32768.0; var2 = var2 + var1 * ((double)bme->trim.dig_P5) * 2.0; var2 = (var2 / 4.0) + (((double)bme->trim.dig_P4) * 65536.0); - var1 = (((double)bme->trim.dig_P3) * var1 * var1 / 524288.0 + ((double)bme->trim.dig_P2) * var1) / 524288.0; + var1 = (((double)bme->trim.dig_P3) * var1 * var1 / 524288.0 + + ((double)bme->trim.dig_P2) * var1) / + 524288.0; var1 = (1.0 + var1 / 32768.0) * ((double)bme->trim.dig_P1); - if (var1 == 0.0) - { + if(var1 == 0.0) { return 0; // avoid exception caused by division by zero } p = 1048576.0 - (double)adc_P; @@ -201,13 +210,16 @@ double _bme280_compensate_P(bme280_t *bme, int32_t adc_P) { double _bme280_compensate_H(bme280_t *bme, int32_t adc_H) { double var_H; var_H = (((double)bme->t_fine) - 76800.0); - var_H = (adc_H - (((double)bme->trim.dig_H4) * 64.0 + ((double)bme->trim.dig_H5) / 16384.0 * - var_H)) * - (((double)bme->trim.dig_H2) / 65536.0 * (1.0 + ((double)bme->trim.dig_H6) / 67108864.0 * var_H * (1.0 + ((double)bme->trim.dig_H3) / 67108864.0 * var_H))); + var_H = + (adc_H - (((double)bme->trim.dig_H4) * 64.0 + + ((double)bme->trim.dig_H5) / 16384.0 * var_H)) * + (((double)bme->trim.dig_H2) / 65536.0 * + (1.0 + ((double)bme->trim.dig_H6) / 67108864.0 * var_H * + (1.0 + ((double)bme->trim.dig_H3) / 67108864.0 * var_H))); var_H = var_H * (1.0 - ((double)bme->trim.dig_H1) * var_H / 524288.0); - if (var_H > 100.0) + if(var_H > 100.0) var_H = 100.0; - else if (var_H < 0.0) + else if(var_H < 0.0) var_H = 0.0; return var_H; } diff --git a/lib/bme280_dht/bme280_dht.h b/lib/bme280_dht/bme280_dht.h index 993a67c..e94158b 100644 --- a/lib/bme280_dht/bme280_dht.h +++ b/lib/bme280_dht/bme280_dht.h @@ -35,27 +35,28 @@ typedef enum { typedef struct { bme280_ret_t (*read_register_cb)(void *handle, uint8_t reg, uint8_t *data, uint8_t len); bme280_ret_t (*write_register_cb)(void *handle, uint8_t reg, uint8_t data); + bme280_ret_t (*delay_cb)(void *handle, uint32_t delay_ms); } bme280_cb_t; typedef struct { - unsigned short dig_T1; - short dig_T2; - short dig_T3; - unsigned short dig_P1; - short dig_P2; - short dig_P3; - short dig_P4; - short dig_P5; - short dig_P6; - short dig_P7; - short dig_P8; - short dig_P9; - unsigned char dig_H1; - short dig_H2; - unsigned char dig_H3; - short dig_H4; - short dig_H5; - char dig_H6; + uint16_t dig_T1; + int16_t dig_T2; + int16_t dig_T3; + uint16_t dig_P1; + int16_t dig_P2; + int16_t dig_P3; + int16_t dig_P4; + int16_t dig_P5; + int16_t dig_P6; + int16_t dig_P7; + int16_t dig_P8; + int16_t dig_P9; + uint8_t dig_H1; + int16_t dig_H2; + uint8_t dig_H3; + int16_t dig_H4; + int16_t dig_H5; + int8_t dig_H6; } bme280_trim_t; typedef struct { diff --git a/lib/mqtt_influx/mqtt_influx.c b/lib/mqtt_influx/mqtt_influx.c index 47e4576..5cc741c 100644 --- a/lib/mqtt_influx/mqtt_influx.c +++ b/lib/mqtt_influx/mqtt_influx.c @@ -28,11 +28,16 @@ mqtt_influx_ret_t mqtt_influx_publish_measurement(mqtt_influx_t *influx, char mqtt_buf[MAX_MQTT_REPORT_SIZE]; char ns_ts[32]; + if(influx->cb.get_nsec_timestamp_cb(influx->user_data, ns_ts) != MQTT_INFLUX_OK) { return MQTT_INFLUX_ERROR; } + for(int i = 0; i < MAX_MQTT_REPORT_SIZE; i++) { + mqtt_buf[i] = '\0'; + } + concat_string(mqtt_buf, MAX_MQTT_REPORT_SIZE, meas->measurement); concat_string(mqtt_buf, MAX_MQTT_REPORT_SIZE, ",hostname="); concat_string(mqtt_buf, MAX_MQTT_REPORT_SIZE, influx->hostname); @@ -40,6 +45,7 @@ mqtt_influx_ret_t mqtt_influx_publish_measurement(mqtt_influx_t *influx, concat_string(mqtt_buf, MAX_MQTT_REPORT_SIZE, meas->key); concat_string(mqtt_buf, MAX_MQTT_REPORT_SIZE, "="); concat_string(mqtt_buf, MAX_MQTT_REPORT_SIZE, meas->value); + concat_string(mqtt_buf, MAX_MQTT_REPORT_SIZE, " "); concat_string(mqtt_buf, MAX_MQTT_REPORT_SIZE, ns_ts); if(influx->cb.publish_message_cb(influx->user_data, mqtt_buf) != MQTT_INFLUX_OK) { diff --git a/misc/agent_config.cfg.example b/misc/agent_config.cfg.example index 3c4efed..31e1be9 100644 --- a/misc/agent_config.cfg.example +++ b/misc/agent_config.cfg.example @@ -74,6 +74,6 @@ agent: { }; theme: { - background = "A:background.bin" + background = "A:background.bin"; }; }; diff --git a/misc/agent_config.cfg.pine64 b/misc/agent_config.cfg.pine64 index 3baf1a8..bf0a369 100644 --- a/misc/agent_config.cfg.pine64 +++ b/misc/agent_config.cfg.pine64 @@ -8,18 +8,19 @@ agent: { devices: { dht: { i2c: { - path = "/dev/i2c-1"; + path = "/dev/i2c-0"; addr = 0x76; }; + }; tvoc: { i2c: { - path = "/dev/i2c-1"; + path = "/dev/i2c-0"; addr = 0x5a; }; nwake_pin: { path = "/dev/gpiochip1"; - line = 5; + line = 230; }; }; @@ -73,6 +74,6 @@ agent: { }; theme: { - background = "A:images/background.bin" + background = "A:images/background.bin"; }; }; diff --git a/misc/agent_config.cfg.rpi4 b/misc/agent_config.cfg.rpi4 index bac9e2f..5ae7091 100644 --- a/misc/agent_config.cfg.rpi4 +++ b/misc/agent_config.cfg.rpi4 @@ -11,6 +11,7 @@ agent: { path = "/dev/i2c-1"; addr = 0x76; }; + }; tvoc: { i2c: { @@ -73,6 +74,6 @@ agent: { }; theme: { - background = "A:images/background.bin" + background = "A:images/background.bin"; }; }; diff --git a/src/drivers/user_config_driver.c b/src/drivers/user_config_driver.c index 19ae72b..f76ac7b 100644 --- a/src/drivers/user_config_driver.c +++ b/src/drivers/user_config_driver.c @@ -1,8 +1,7 @@ #include -#include "utils/user_log_util.h" - #include "drivers/user_config_driver.h" +#include "utils/user_log_util.h" int user_config_init(user_config_t *config, char *config_file) { USER_LOG(USER_LOG_INFO, "Config init."); @@ -13,7 +12,11 @@ int user_config_init(user_config_t *config, char *config_file) { config_init(config->libconfig_cfg); if(!config_read_file(config->libconfig_cfg, config_file)) { - USER_LOG(USER_LOG_ERROR, "Failed to read config file %s.", config_file); + USER_LOG(USER_LOG_ERROR, + "Failed to read config file %s: %s in file %s at line %d.", + config_file, config_error_text(config->libconfig_cfg), + config_error_file(config->libconfig_cfg), + config_error_line(config->libconfig_cfg)); return -2; } @@ -37,7 +40,8 @@ int user_config_lookup_int(user_config_t *config, char *path, int *value) { return 0; } -int user_config_lookup_double(user_config_t *config, char *path, double *value) { +int user_config_lookup_double(user_config_t *config, char *path, + double *value) { if(config_lookup_float(config->libconfig_cfg, path, value) == 0) { return -1; } diff --git a/src/drivers/user_gpio_driver.c b/src/drivers/user_gpio_driver.c index 5e6b4d6..b181c45 100644 --- a/src/drivers/user_gpio_driver.c +++ b/src/drivers/user_gpio_driver.c @@ -54,7 +54,7 @@ int user_gpio_setup_intr(user_gpio_t *gpio, user_gpio_intr_t type) { request_type = GPIOD_LINE_REQUEST_EVENT_RISING_EDGE; else if(type == USER_GPIO_INTR_FALLING) request_type = GPIOD_LINE_REQUEST_EVENT_FALLING_EDGE; - else if(type == USER_GPIO_INTR_RISING | USER_GPIO_INTR_FALLING) + else if(type == (USER_GPIO_INTR_RISING | USER_GPIO_INTR_FALLING)) request_type = GPIOD_LINE_REQUEST_EVENT_BOTH_EDGES; const struct gpiod_line_request_config config = { diff --git a/src/impl/user_bme280_impl.c b/src/impl/user_bme280_impl.c index 31879d2..e3e53c3 100644 --- a/src/impl/user_bme280_impl.c +++ b/src/impl/user_bme280_impl.c @@ -45,6 +45,7 @@ int user_bme280_impl_init(user_bme280_impl_t *impl) { int user_bme280_impl_deinit(user_bme280_impl_t *impl) { close(impl->i2cdev_fd); + return 0; } bme280_ret_t user_bme280_impl_read_register_cb(user_bme280_impl_t *impl, @@ -60,15 +61,24 @@ bme280_ret_t user_bme280_impl_read_register_cb(user_bme280_impl_t *impl, return BME_FAIL; } + for(uint8_t i = 0; i < len; i++) { + USER_LOG(USER_LOG_DEBUG, "I2C read, reg=%x, value=%x.", reg, data[i]); + } return BME_OK; } bme280_ret_t user_bme280_impl_write_register_cb(user_bme280_impl_t *impl, uint8_t reg, uint8_t data) { uint8_t tx_buf[2] = {reg, data}; + USER_LOG(USER_LOG_DEBUG, "I2C write, reg=%d, value=%d.", reg, data); if(write(impl->i2cdev_fd, tx_buf, 0x02) < 2) { USER_LOG(USER_LOG_WARN, "I2C write failed, reg=%d.", reg); return BME_FAIL; } return BME_OK; +} + +bme280_ret_t user_bme280_impl_delay_cb(user_bme280_impl_t *impl, uint32_t delay_ms) { + usleep(delay_ms * 1000); + return BME_OK; } \ No newline at end of file diff --git a/src/impl/user_lvgl_impl.c b/src/impl/user_lvgl_impl.c index 5b3706b..bfd6afc 100644 --- a/src/impl/user_lvgl_impl.c +++ b/src/impl/user_lvgl_impl.c @@ -141,7 +141,7 @@ lv_fs_res_t user_lvgl_impl_fs_read_cb(lv_fs_drv_t *drv, void *file_p, void *buf, USER_LOG(USER_LOG_DEBUG, "Called read() on fd %d, len=%d, rlen=%d", fd, btr, *br); - if(*br < 0) return LV_FS_RES_FS_ERR; + if((int)*br < 0) return LV_FS_RES_FS_ERR; return LV_FS_RES_OK; } @@ -155,7 +155,7 @@ lv_fs_res_t user_lvgl_impl_fs_write_cb(lv_fs_drv_t *drv, void *file_p, if(fd > 0) { *bw = write(fd, buf, btw); - if(*bw < 0) return LV_FS_RES_FS_ERR; + if((int)*bw < 0) return LV_FS_RES_FS_ERR; return LV_FS_RES_OK; } @@ -201,7 +201,7 @@ lv_fs_res_t user_lvgl_impl_fs_tell_cb(lv_fs_drv_t *drv, void *file_p, USER_LOG(USER_LOG_DEBUG, "Called tell() on fd %d, pos=%d", fd, *pos_p); - if(*pos_p < 0) return LV_FS_RES_FS_ERR; + if((int)*pos_p < 0) return LV_FS_RES_FS_ERR; return LV_FS_RES_OK; } diff --git a/src/impl/user_mqtt_impl.c b/src/impl/user_mqtt_impl.c index 078bf51..d3fc043 100644 --- a/src/impl/user_mqtt_impl.c +++ b/src/impl/user_mqtt_impl.c @@ -3,11 +3,15 @@ #include "impl/user_mqtt_impl.h" +#include "utils/user_log_util.h" + mqtt_influx_ret_t user_mqtt_get_nsec_timestamp_cb(user_mqtt_impl_t *handle, char *timestamp_string) { sprintf(timestamp_string, "00000000"); return MQTT_INFLUX_OK; } mqtt_influx_ret_t user_mqtt_publish_message_cb(user_mqtt_impl_t *handle, char *data) { - fprintf(stderr, data); + USER_LOG(USER_LOG_INFO, "INFLUX: %s", data); + + return MQTT_INFLUX_OK; } \ No newline at end of file diff --git a/src/impl/user_st7789_impl.c b/src/impl/user_st7789_impl.c index fea5e88..6c2acd9 100644 --- a/src/impl/user_st7789_impl.c +++ b/src/impl/user_st7789_impl.c @@ -21,7 +21,7 @@ static int user_st7789_impl_init_pin(user_gpio_t *gpio, char *pin_name, uint8_t snprintf(name_buffer, 64, "agent.devices.lcd.%s_pin.line", pin_name); - if(user_config_lookup_int(&g_config, name_buffer, &offset) != 0) return -2; + if(user_config_lookup_int(&g_config, name_buffer, (int *)&offset) != 0) return -2; if(user_gpio_init(gpio, chip, offset, is_output) != 0) return -3; diff --git a/src/impl/user_stick_impl.c b/src/impl/user_stick_impl.c index 8580772..ce67aeb 100644 --- a/src/impl/user_stick_impl.c +++ b/src/impl/user_stick_impl.c @@ -20,7 +20,7 @@ static int user_stick_impl_init_pin(user_gpio_t *gpio, char *pin_name, uint8_t i snprintf(name_buffer, 64, "agent.devices.stick.%s.line", pin_name); - if(user_config_lookup_int(&g_config, name_buffer, &offset) != 0) return -2; + if(user_config_lookup_int(&g_config, name_buffer, (int *)&offset) != 0) return -2; if(user_gpio_init(gpio, chip, offset, is_output) != 0) return -3; diff --git a/src/main.c b/src/main.c index 558b858..8cd9495 100644 --- a/src/main.c +++ b/src/main.c @@ -15,7 +15,6 @@ uint8_t g_running = 1; user_config_t g_config; - static void signal_handler(int signo) { if(signo == SIGINT || signo == SIGTERM) { g_running = 0; diff --git a/src/tasks/user_base_task.c b/src/tasks/user_base_task.c index 13313ea..9c74c90 100644 --- a/src/tasks/user_base_task.c +++ b/src/tasks/user_base_task.c @@ -13,6 +13,8 @@ int user_base_task_init(void) { pthread_setname_np(user_base_task_thread, "BASE"); USER_LOG(USER_LOG_INFO, "BASE thread created."); + + return 0; } int user_base_task_deinit(void) { diff --git a/src/tasks/user_clock_task.c b/src/tasks/user_clock_task.c index c912cbc..00408a9 100644 --- a/src/tasks/user_clock_task.c +++ b/src/tasks/user_clock_task.c @@ -17,6 +17,8 @@ int user_clock_task_init(void) { pthread_setname_np(user_clock_task_thread, "CLOCK"); USER_LOG(USER_LOG_INFO, "CLOCK thread created."); + + return 0; } int user_clock_task_deinit(void) { diff --git a/src/tasks/user_dht_task.c b/src/tasks/user_dht_task.c index c842cec..55eb3d8 100644 --- a/src/tasks/user_dht_task.c +++ b/src/tasks/user_dht_task.c @@ -1,8 +1,8 @@ #include #include "impl/user_bme280_impl.h" - #include "tasks/user_task_lvgl_common.h" +#include "tasks/user_task_mqtt_common.h" void *user_dht_task(void *arguments); pthread_t user_dht_task_thread; @@ -14,6 +14,8 @@ int user_dht_task_init(void) { if(ret) return ret; pthread_setname_np(user_dht_task_thread, "DHT"); + + return 0; } int user_dht_task_deinit(void) { @@ -38,21 +40,35 @@ void *user_dht_task(void *arguments) { uint8_t))user_bme280_impl_read_register_cb, .write_register_cb = (bme280_ret_t(*)(void *, uint8_t, uint8_t)) user_bme280_impl_write_register_cb, + .delay_cb = (bme280_ret_t(*)( + void *, uint32_t))user_bme280_impl_delay_cb, }, - .user_data = &bme_impl - }; + .user_data = &bme_impl}; bme280_config_t cfg; - bme280_init(&bme); + if(bme280_init(&bme) == BME_FAIL) { + USER_LOG(USER_LOG_FATAL, "BME280 init failed."); + } bme280_preset_config(&cfg, BME_PRESET_WEATHER); bme280_apply_config(&bme, &cfg); bme280_result_t res; + mqtt_influx_measure_t meas; + char value_buf[32]; + + meas.measurement = "dht"; while(g_running) { bme280_measure(&bme, &res); - USER_LOG(USER_LOG_INFO, "BME: %.02f, %.02f, %.02f", res.temperature, res.humidity, res.pressure); + USER_LOG(USER_LOG_INFO, "BME: %.02f, %.02f, %.02f", res.temperature, + res.humidity, res.pressure); + meas.key = "temperature"; + snprintf(value_buf, 32, "%.02f", res.temperature); + meas.value = value_buf; + mqtt_influx_publish_measurement(&g_mqtt_influx, &meas); sleep(1); } + + return NULL; } diff --git a/src/tasks/user_lvgl_task.c b/src/tasks/user_lvgl_task.c index b6b8ad2..1e03929 100644 --- a/src/tasks/user_lvgl_task.c +++ b/src/tasks/user_lvgl_task.c @@ -74,6 +74,8 @@ int user_lvgl_task_init(void) { pthread_setname_np(user_lv_tick_thread, "LV_TICK"); g_lvgl_ready = 1; + + return 0; } int user_lvgl_task_deinit(void) { diff --git a/src/tasks/user_mqtt_task.c b/src/tasks/user_mqtt_task.c index 0c8f238..f10981b 100644 --- a/src/tasks/user_mqtt_task.c +++ b/src/tasks/user_mqtt_task.c @@ -5,14 +5,14 @@ static user_mqtt_impl_t s_mqtt_impl; mqtt_influx_t g_mqtt_influx = { - .cb = { - .get_nsec_timestamp_cb = (mqtt_influx_ret_t (*)(void *, char *))user_mqtt_get_nsec_timestamp_cb, - .publish_message_cb = (mqtt_influx_ret_t (*)(void *, char *))user_mqtt_publish_message_cb - }, + .cb = {.get_nsec_timestamp_cb = (mqtt_influx_ret_t(*)( + void *, char *))user_mqtt_get_nsec_timestamp_cb, + .publish_message_cb = (mqtt_influx_ret_t(*)( + void *, char *))user_mqtt_publish_message_cb}, .user_data = &s_mqtt_impl, + .hostname = "SystemAgent", }; - pthread_t user_mqtt_task_thread; void *user_mqtt_task(void *arguments); @@ -26,6 +26,8 @@ int user_mqtt_task_init(void) { pthread_setname_np(user_mqtt_task_thread, "MQTT"); USER_LOG(USER_LOG_INFO, "MQTT thread created."); + + return 0; } int user_mqtt_task_deinit(void) { diff --git a/src/tasks/user_tvoc_task.c b/src/tasks/user_tvoc_task.c index b8712a9..5afc666 100644 --- a/src/tasks/user_tvoc_task.c +++ b/src/tasks/user_tvoc_task.c @@ -14,6 +14,8 @@ int user_tvoc_task_init(void) { if(ret) return ret; pthread_setname_np(user_tvoc_task_thread, "TVOC"); + + return 0; } int user_tvoc_task_deinit(void) { @@ -53,4 +55,6 @@ void *user_tvoc_task(void *arguments) { } user_ccs811_impl_deinit(&impl); + + return NULL; } diff --git a/src/utils/user_log_util.c b/src/utils/user_log_util.c index d0b1dc7..f532e1a 100644 --- a/src/utils/user_log_util.c +++ b/src/utils/user_log_util.c @@ -42,7 +42,7 @@ void user_log_print(user_log_level_t level, char *fmt, ...) { va_list args; va_start(args, fmt); - fprintf(stderr, "[% 9d]%s ", time(NULL), level_str); + fprintf(stderr, "[% 9ld]%s ", time(NULL), level_str); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); fflush(stderr);