Multiple bugfixes.
This commit is contained in:
parent
d107d4cf43
commit
548617c183
|
@ -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")
|
|
@ -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
|
|
@ -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
|
|
@ -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, ...);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -74,6 +74,6 @@ agent: {
|
|||
};
|
||||
|
||||
theme: {
|
||||
background = "A:background.bin"
|
||||
background = "A:background.bin";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue