#include #include "ch32v003fun.h" #include "config.h" #include "debug.h" #include "gpio.h" #include "modbus.h" #include "mqtt_handler.h" #include "network.h" #include "onewire_temp.h" #include "spi_dma.h" #include "systick.h" #include "timer.h" #include "uart.h" #define W5500_INIT_DELAY_MS 55 static mqtt_state_t mqtt_state; void sysinit(void) { SystemInit(); gpio_init(); systick_init(); tim2_init(); spidma_init(); uart2_init(UART_BRR_APB1); rs485_init(UART_BRR_APB2); } // Callback for modbus values static void on_modbus_value(uint8_t device_idx, const char* property, uint16_t value) { if (mqtt_state.is_connected) { modbus_publish_value(&mqtt_state.client, RS485_DEVICES[device_idx].name, property, value); } } int main(void) { sysinit(); Delay_Ms(W5500_INIT_DELAY_MS); configure_network(); network_init(); // block forever until dhcp resolves while (dhcp_get_state() != DHCP_STATE_LEASED) { dhcp_process(); } // init handlers // init sensors before mqtt so we can add them to discovery onewire_temp_init(); onewire_temp_set_parallel(true); mqtt_init(&mqtt_state); modbus_handler_init(on_modbus_value); uint32_t last_temp_publish = 0; uint32_t last_temp_conversion = 0; const uint32_t TEMP_PUBLISH_INTERVAL = 10000; // 10 seconds const uint32_t CONVERSION_INTERVAL = 1000; // 1 second while (1) { uint32_t current_time = millis(); led_status_process(); dhcp_process(); mqtt_process(&mqtt_state); modbus_handler_process(); // TODO: doesn't make sense to convert every 1s, should be the same interval // as publish if (current_time - last_temp_conversion >= CONVERSION_INTERVAL) { onewire_temp_start_parallel(); last_temp_conversion = current_time; } onewire_temp_process(); // process all sensors if (current_time - last_temp_publish >= TEMP_PUBLISH_INTERVAL) { if (mqtt_state.is_connected) { onewire_temp_publish_values(&mqtt_state.client, NODE_CONFIG.id); } last_temp_publish = current_time; } } return 0; }