[feat] UART command interface, per-motor control, filtering modules

- Add callback_task with ISR-based UART command parser (@command\n protocol)
- Add log_printf with mutex protection to prevent printf interleaving
- Add per-motor enable/disable (motor enable yaw|pitch)
- Add PID tuning via UART (pid roll kp 15)
- Add cmd_parser module (registration + tokenize + dispatch)
- Add UART layer architecture (interface → HAL → BSP)
- Add filter modules (lowpass, moving_average, notch, rate_limiter)
- Rewrite I2C bus and UART bus modules
- Rewrite PID controller and MF4010V2 motor driver
- Fix soft I2C driver

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
robinson
2026-05-21 01:38:11 +08:00
parent 75966b174d
commit cf934cf6b7
46 changed files with 2372 additions and 2131 deletions

34
modules/bus/i2c/i2c_bus.c Normal file
View File

@@ -0,0 +1,34 @@
#include "i2c_bus.h"
#include "i2c_if.h"
#include <stdbool.h>
int i2c_init(i2c_t* obj, int ch) {
if (!obj || obj->initialized) {
return -1;
}
obj->ch = ch;
obj->initialized = true;
i2c_if_init(ch);
return 0;
}
int i2c_mem_write(i2c_t* obj, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, const uint8_t *data, uint16_t size, uint32_t timeout) {
if (!obj || obj->initialized == false)
return -1;
return i2c_if_mem_write(obj->ch, dev_addr, mem_addr, mem_add_size, data, size, timeout);
}
int i2c_mem_read(i2c_t* obj, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, uint8_t *data, uint16_t size, uint32_t timeout) {
if (!obj || obj->initialized == false)
return -1;
return i2c_if_mem_read(obj->ch, dev_addr, mem_addr, mem_add_size, data, size, timeout);
}
int i2c_write(i2c_t* obj, uint16_t dev_addr, const uint8_t *data, uint16_t size, uint32_t timeout) {
if (!obj || obj->initialized == false)
return -1;
return i2c_if_write(obj->ch, dev_addr, data, size, timeout);
}
int i2c_read(i2c_t* obj, uint16_t dev_addr, uint8_t *data, uint16_t size, uint32_t timeout) {
if (!obj || obj->initialized == false)
return -1;
return i2c_if_read(obj->ch, dev_addr, data, size, timeout);
}

17
modules/bus/i2c/i2c_bus.h Normal file
View File

@@ -0,0 +1,17 @@
#ifndef I2C_BUS_H
#define I2C_BUS_H
#include <stdint.h>
#include <stdbool.h>
typedef struct {
int ch;
bool initialized;
} i2c_t;
int i2c_init(i2c_t* obj, int ch);
int i2c_mem_write(i2c_t* obj, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, const uint8_t *data, uint16_t size, uint32_t timeout);
int i2c_mem_read(i2c_t* obj, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, uint8_t *data, uint16_t size, uint32_t timeout);
int i2c_write(i2c_t* obj, uint16_t dev_addr, const uint8_t *data, uint16_t size, uint32_t timeout);
int i2c_read(i2c_t* obj, uint16_t dev_addr, uint8_t *data, uint16_t size, uint32_t timeout);
#endif

76
modules/bus/uart/uart.c Normal file
View File

@@ -0,0 +1,76 @@
#include "uart.h"
int uart_init(uart_t *uart, int ch, const uart_config_t *cfg)
{
if (!uart || !cfg)
return -1;
uart->ch = ch;
uart->config = *cfg;
int ret = uart_if_init(ch, cfg);
if (ret == 0)
uart->initialized = 1;
return ret;
}
int uart_deinit(uart_t *uart)
{
if (!uart || !uart->initialized)
return -1;
int ret = uart_if_deinit(uart->ch);
if (ret == 0)
uart->initialized = 0;
return ret;
}
int uart_send(uart_t *uart, const uint8_t *data, size_t size, uint32_t timeout)
{
if (!uart || !uart->initialized || !data)
return -1;
return uart_if_send(uart->ch, data, size, timeout);
}
int uart_receive(uart_t *uart, uint8_t *data, size_t size, uint32_t timeout)
{
if (!uart || !uart->initialized || !data)
return -1;
return uart_if_receive(uart->ch, data, size, timeout);
}
int uart_send_it(uart_t *uart, const uint8_t *data, size_t size)
{
if (!uart || !uart->initialized || !data)
return -1;
return uart_if_send_it(uart->ch, data, size);
}
int uart_receive_it(uart_t *uart, uint8_t *data, size_t size)
{
if (!uart || !uart->initialized || !data)
return -1;
return uart_if_receive_it(uart->ch, data, size);
}
int uart_putc(uart_t *uart, uint8_t c)
{
if (!uart || !uart->initialized)
return -1;
return uart_if_putc(uart->ch, c);
}
int uart_getc(uart_t *uart, uint8_t *c)
{
if (!uart || !uart->initialized || !c)
return -1;
return uart_if_getc(uart->ch, c);
}

23
modules/bus/uart/uart.h Normal file
View File

@@ -0,0 +1,23 @@
#ifndef UART_H
#define UART_H
#include <stdint.h>
#include <stddef.h>
#include "uart_if.h"
typedef struct {
int ch;
int initialized;
uart_config_t config;
} uart_t;
int uart_init(uart_t *uart, int ch, const uart_config_t *cfg);
int uart_deinit(uart_t *uart);
int uart_send(uart_t *uart, const uint8_t *data, size_t size, uint32_t timeout);
int uart_receive(uart_t *uart, uint8_t *data, size_t size, uint32_t timeout);
int uart_send_it(uart_t *uart, const uint8_t *data, size_t size);
int uart_receive_it(uart_t *uart, uint8_t *data, size_t size);
int uart_putc(uart_t *uart, uint8_t c);
int uart_getc(uart_t *uart, uint8_t *c);
#endif