Add initial board, HAL, and executor modules

This commit is contained in:
wang committed 2026-05-07 17:24:10 +08:00
1 parent 3b9e129c88
commit 0b2eebe76d
82 files changed
+20611

No files matched your search

@@ -0,0 +1,41 @@
#pragma once
#include <cstdint>
#include <cstddef>
#include "esp_err.h"
/**
* @brief Base Board Hardware Abstraction Layer
* Abstracts the communication transport (UART vs I2C) and sensor reading.
*/
class BaseBoardHal
{
public:
virtual ~BaseBoardHal() = default;
/**
* @brief Initialize the hardware interface
*/
virtual esp_err_t Init() = 0;
/**
* @brief Send raw data to the base board
* @param data Pointer to data buffer
* @param len Length of data
*/
virtual esp_err_t Send(const uint8_t *data, size_t len) = 0;
/**
* @brief Read raw data from the base board
* @param data Pointer to data buffer
* @param len Length of data to read
*/
virtual esp_err_t Read(uint8_t *data, size_t len) = 0;
/**
* @brief Get the current angle from Hall sensor (or via query)
* @param[out] angle Output angle in degrees (0.0 - 360.0)
* @return ESP_OK on success
*/
virtual esp_err_t GetAngle(float *angle) = 0;
};
@@ -0,0 +1,65 @@
#pragma once
#include "base_board_hal.h"
#include "i2c_bus.h"
#include "esp_log.h"
class BaseBoardHalI2c : public BaseBoardHal
{
public:
static constexpr uint8_t kBaseSlaveAddr = 0x22;
// TMAG5273 default address often 0x35 or defined by config
static constexpr uint8_t kHallSensorAddr = 0x35;
BaseBoardHalI2c(i2c_bus_handle_t bus_handle)
: bus_handle_(bus_handle) {}
virtual ~BaseBoardHalI2c()
{
// i2c_bus handles device management internally if used via i2c_bus_create
// But here we just use the bus handle directly.
}
virtual esp_err_t Init() override
{
if (!bus_handle_) return ESP_ERR_INVALID_STATE;
// Check if device is alive
esp_err_t err = i2c_bus_probe_addr(bus_handle_, kBaseSlaveAddr << 1);
if (err != ESP_OK) {
ESP_LOGW("BaseBoardHalI2c", "Base board not found at 0x%02X", kBaseSlaveAddr);
// Don't fail init, maybe it's sleeping
} else {
ESP_LOGI("BaseBoardHalI2c", "Base board found at 0x%02X", kBaseSlaveAddr);
}
return ESP_OK;
}
virtual esp_err_t Send(const uint8_t *data, size_t len) override
{
if (!bus_handle_) return ESP_ERR_INVALID_STATE;
// i2c_bus_write_bytes expects: bus, addr, reg_addr, reg_len, data, datalen
// The data pointer in i2c_bus_write_bytes is (uint8_t *), not (const uint8_t *)
// This is a common issue in legacy C APIs. We have to cast away constness.
return i2c_bus_write_bytes(bus_handle_, kBaseSlaveAddr << 1, NULL, 0, (uint8_t*)data, len);
}
virtual esp_err_t Read(uint8_t *data, size_t len) override
{
if (!bus_handle_) return ESP_ERR_INVALID_STATE;
return i2c_bus_read_bytes(bus_handle_, kBaseSlaveAddr << 1, NULL, 0, data, len);
}
virtual esp_err_t GetAngle(float *angle) override
{
// TODO: Implement TMAG5273 read logic using i2c_bus_read_bytes
return ESP_ERR_NOT_SUPPORTED;
}
private:
i2c_bus_handle_t bus_handle_;
};
@@ -0,0 +1,45 @@
#pragma once
#include "base_board_hal.h"
#include "driver/uart.h"
class BaseBoardHalUart : public BaseBoardHal
{
public:
BaseBoardHalUart(uart_port_t port) : port_(port) {}
virtual ~BaseBoardHalUart() = default;
virtual esp_err_t Init() override
{
// Assuming UART is already initialized by board.cc or similar
return ESP_OK;
}
virtual esp_err_t Send(const uint8_t *data, size_t len) override
{
if (port_ >= UART_NUM_MAX) {
return ESP_ERR_INVALID_STATE;
}
int written = uart_write_bytes(port_, (const char *)data, len);
return (written == (int)len) ? ESP_OK : ESP_FAIL;
}
virtual esp_err_t Read(uint8_t *data, size_t len) override
{
if (port_ >= UART_NUM_MAX) {
return ESP_ERR_INVALID_STATE;
}
int read = uart_read_bytes(port_, data, len, pdMS_TO_TICKS(100));
return (read == (int)len) ? ESP_OK : ESP_FAIL;
}
virtual esp_err_t GetAngle(float *angle) override
{
// TODO: Implement angle reading via UART (query command or report parsing)
// For now, return not supported or cached value if we had one
return ESP_ERR_NOT_SUPPORTED;
}
private:
uart_port_t port_;
};
+13
View File
@@ -0,0 +1,13 @@
# main/04_hal/base_board_hal/module.cmake
# 注意:此文件夹可能没有 cpp 源文件,仅有头文件。如果有源文件,请追加到 MODULE_SRCS。
# 判断 menuconfig 中的开关
if(NOT CONFIG_ENABLE_HAL_BASE_BOARD_HAL AND NOT EARLY_EXPANSION)
message(STATUS " [Skip] base_board_hal module disabled by menuconfig.")
return()
endif()
list(APPEND MODULE_INCLUDE_DIRS
"04_hal/base_board_hal"
)