[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:
34
modules/bus/i2c/i2c_bus.c
Normal file
34
modules/bus/i2c/i2c_bus.c
Normal 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
17
modules/bus/i2c/i2c_bus.h
Normal 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
76
modules/bus/uart/uart.c
Normal 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
23
modules/bus/uart/uart.h
Normal 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
|
||||
Reference in New Issue
Block a user