Squashed commit of the following: commit 5f16309f629b9928d2134b85ae64af69bc3ebbcd Author: kuwoyuki <kuwoyuki@cock.li> Date: Sun Nov 24 22:55:15 2024 +0600 fix: Makefile, improve onewire retries commit 55496a3bda941b52ff349dc75c9c06eb5a37c07d Author: kuwoyuki <kuwoyuki@cock.li> Date: Mon Nov 18 00:41:18 2024 +0600 fix: make onewire validity less strict commit 3428a9bc9792508972ce3e7e4e35a64f047bca10 Author: kuwoyuki <kuwoyuki@cock.li> Date: Sun Nov 17 23:57:55 2024 +0600 chore: rm bins commit 1594e5ed430522b15466c8afa62ff7fb1b28947c Author: kuwoyuki <kuwoyuki@cock.li> Date: Sun Nov 17 23:32:01 2024 +0600 chore: unplatformiofy
89 lines
2.1 KiB
C
89 lines
2.1 KiB
C
#include <string.h>
|
|
|
|
#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;
|
|
}
|