Files
ch32v203-eth-node/ch32_node.c
kuwoyuki 8adc726b0b chore: debloat (remove platformio), onewire improvements
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
2024-11-24 22:56:05 +06:00

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