Multiple bugfixes.

This commit is contained in:
imi415 2021-07-25 23:22:04 +08:00
parent d107d4cf43
commit 548617c183
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
26 changed files with 176 additions and 95 deletions

View File

@ -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")
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-pthread")
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wall" "-Wextra" "-Wno-unused")

View File

@ -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

View File

@ -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

View File

@ -1,6 +1,8 @@
#ifndef __USER_LOG_UTIL_H
#define __USER_LOG_UTIL_H
#include <string.h>
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, ...);

View File

@ -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"

View File

@ -1,49 +1,53 @@
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#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;
}

View File

@ -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 {

View File

@ -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) {

View File

@ -74,6 +74,6 @@ agent: {
};
theme: {
background = "A:background.bin"
background = "A:background.bin";
};
};

View File

@ -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";
};
};

View File

@ -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";
};
};

View File

@ -1,8 +1,7 @@
#include <stdlib.h>
#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;
}

View File

@ -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 = {

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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) {

View File

@ -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) {

View File

@ -1,8 +1,8 @@
#include <stdint.h>
#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;
}

View File

@ -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) {

View File

@ -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) {

View File

@ -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;
}

View File

@ -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);